相关疑难解决方法(0)

字符串作为指针与数组

我想知道以下定义之间的差异:

// file.cpp:
namespace n
{
static char const * const str1 = "hello";
static char const str2[] = "hello";
}
Run Code Online (Sandbox Code Playgroud)

我想要的行为,我认为它们都提供:

  • 它们都引用不可变数据(因为数据是char consts)
  • 两个变量都不能被修改(因为str1被定义为*const,因为str2是一个数组,不能用作l值?)
  • 他们都有内部联系(通过静态)
  • 它们都具有命名空间范围
  • 如果指向一个字符串数据的指针可用于另一个模块(通过此处未指定的某个函数),那些字符串的内存将是有效的(str1因为它指向字符串文字,而str2因为数组是在命名空间处声明的范围)

这种语言是否有任何差异?如果存在依赖于实现的行为,我如何调查不同平台上的差异?

(对于这个例子,我对将这些行为与std :: string选项进行对比不感兴趣,但是如果你认为其他读者会感兴趣,也可以随意谈论它.)

c++ arrays string pointers const

3
推荐指数
1
解决办法
213
查看次数

C结构中char*和char []的差异

当我想在C结构中存储动态数据数组时,有两种方法可以编写它:

typedef struct {
   int row;
   int col;
   char* data;
} item1;
Run Code Online (Sandbox Code Playgroud)

要么

typedef struct {
   int row;
   int col;
   char data[];
} item2;
Run Code Online (Sandbox Code Playgroud)

他们俩都会工作.但他们在我的64位Mac OSX上有一些差异,使用gcc Apple LLVM 5.1版(clang-503.0.38):

      sizeof(item1) is 16
      sizeof(item2) is 8
Run Code Online (Sandbox Code Playgroud)

为什么有区别?而且,这两种实现还有什么不同?

完整的测试代码是:

#include <stdio.h>

typedef struct {
  int row;
  int col;
  char* data;
} item1;


typedef struct {
  int row;
  int col;
  char data[];
} item2;


int main() {
  printf("%d %d\n", sizeof(item1), sizeof(item2));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

16 8
Run Code Online (Sandbox Code Playgroud)

c dynamic-arrays

3
推荐指数
1
解决办法
144
查看次数

为什么在我仍然可以访问这些位置时遇到段错误?

我试图使用两个指向相同字符串的指针就地反转一个字符串.第一个(char *p)指向字符串的起始位置,第二个(char *q)指向字符串的结束位置.因此,当我尝试使用gdb进行调试时,我在第16行遇到了分段错误.

当我试图打印的价值*p*q,它工作正常.为什么我仍然能够访问这些位置时遇到段错误?

Breakpoint 1, main () at reverse.c:16
16          *q = *p;
(gdb) print p
$1 = 0x5555555547e4 "hello"
(gdb) print q
$2 = 0x5555555547e8 "o"
(gdb) step

Program received signal SIGSEGV, Segmentation fault.
0x00005555555546db in main () at reverse.c:16
16          *q = *p;
Run Code Online (Sandbox Code Playgroud)

该程序的实际代码是

#include<stdio.h>

int main() {
    char *array = "hello";

    char *p=&array[0];// pointer to the first element

    // Make q point to last value of the array …
Run Code Online (Sandbox Code Playgroud)

c string reverse pointers segmentation-fault

3
推荐指数
1
解决办法
60
查看次数

关于char*和char []基础知识的问题

可能重复:
C中的char s []和char*s有什么区别?
char a [] ="string"之间的区别; char*p ="string";

首先,我想问一下我在哪里可以学习char*和char []的所有基础知识.

大多数时候,我发现自己在如何比较和如何申报方面苦苦挣扎.

例1:

   char *test = "hello world";
Run Code Online (Sandbox Code Playgroud)

这将在编译时产生以下警告:

 warning: deprecated conversion from string constant to ‘char*’
Run Code Online (Sandbox Code Playgroud)

例2:

   vector<char*> test2;
   test2.push_back("hello world");
Run Code Online (Sandbox Code Playgroud)

这将产生复制字符串的错误.

所以我想出的解决方案是:

(它是否正确?)

   vector<char*> test3;
   char *str1 = "hello world"
   test3.push_back(str1);
Run Code Online (Sandbox Code Playgroud)

提前致谢!:)

============================================

这里的人提供了两个好的读物:

char s []和char*s有什么区别?

char a [] ="string"之间的区别; char*p ="string";

c++ char

2
推荐指数
1
解决办法
257
查看次数

c ++中指针的行为

可能重复:
C中的char s []和char*s有什么区别?

int main()
{
    char *t1 = "Hi hello";
    char t2[] = " strcat";

    printf("%s", strcat(t1, t2));
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个程序时,它给了我分段错误

int main()
{
    char t1[] = "Hi hello";
    char *t2 = " strcat";

    printf("%s", strcat(t1, t2));
}
Run Code Online (Sandbox Code Playgroud)

而当我运行下一个程序时,它运行正常并显示连接的字符串.为什么会这样 ?

提前致谢 :)

本问题摘要[已解决]

这个问题非常封闭.只是想添加摘要.我理解的要点是:对于以这种方式声明的变量

char *t1 = "hi hello";  
Run Code Online (Sandbox Code Playgroud)

只需确保添加类型限定符const.因为默认情况下它是只读存储器.不惜任何代价,我们无法修改数据.例如

t1[0] = "L"; 
Run Code Online (Sandbox Code Playgroud)

是不被允许的.以这种方式声明的变量不受我们控制,并且在程序的生命周期内将永久保留.我们甚至无法释放那段记忆.

char t1[10] = "hi hello";
Run Code Online (Sandbox Code Playgroud)

这样我们就可以更好地控制内存.我们被允许修改数组.只要范围消失,分配的内存就会被释放.

char t1[] = "hi hello"; char t2[8] = "hi hello";
Run Code Online (Sandbox Code Playgroud)

两个声明t1和t2非常相同,顺序分配了8个字符位置.

希望我有道理.如果没有请编辑.:)

c c++ pointers

2
推荐指数
1
解决办法
117
查看次数

从字符串文字转换为字符*

我试图在一些公开的线性代数代码中使交流功能起作用.

公开的原型是......

int ilaenv_(int *, char *, char *, int *, int *,int *, int *);
Run Code Online (Sandbox Code Playgroud)

公开的代码有函数调用...

nb = ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); 
Run Code Online (Sandbox Code Playgroud)

其中m,n,c_1和c_n1是整数,

错误消息是.

C++ 11 does not allow conversation from string literal to char *.
Run Code Online (Sandbox Code Playgroud)

我没有创建代码,但是从LAPACK站点下载了代码.我不愿意对可能有效的公开代码进行太多更改,以免引入错误.但是,此错误出现在我正在处理的程序中的许多函数中.

我该如何解决这个问题?

c c++ c++11

2
推荐指数
2
解决办法
5738
查看次数

返回从函数分配的字符串文字的 const char * 是否安全?

我知道这是安全的...

const char *get_str_literal() {
    return "I literally can't even";
}
Run Code Online (Sandbox Code Playgroud)

但这是吗?

const char *get_str_literal() {
    const char *str = "I literally can't even";
    return str;
}
Run Code Online (Sandbox Code Playgroud)

如果不是,为什么?

编辑:下面的代码片段与上面的第二个代码片段有何不同?

const char *get_str_literal() {
    const char str[] = "I literally can't even";
    return str;
}
Run Code Online (Sandbox Code Playgroud)

字符串文字的内容是否被复制到自动数组存储中?发生什么了?

c pointers c-strings

2
推荐指数
1
解决办法
764
查看次数

通过指针更改C中的字符串文字?

可能重复:
为什么在写入字符串时会出现分段错误?

我有以下程序:

char *s     = "abcdf";
char s1[50] = "abcdf";

s1[0] = 'Q';   // Line 1
s[0] = 'P';    // Line 2
Run Code Online (Sandbox Code Playgroud)

为什么Line 1工作正常并Line 2导致程序崩溃?

c string

1
推荐指数
1
解决办法
2400
查看次数

memcpy使用指针抛出访问冲突

我有一个关于memcopy的非常简单的问题,我已经能够修复但不明白为什么.以下代码在runtuime崩溃并出现"访问冲突":

char *src = "HELLO WORLD!";
char * dest = "hello world!";
memcpy(dest, src, strlen(src)+1);
Run Code Online (Sandbox Code Playgroud)

dest似乎足够大,据我所知,memcpy应该盲目地复制字节,所以我不明白这个问题.

将dest更改为数组例如可以char dest[13];解决问题,因此要求dest必须是未初始化的内存并创建数组才能为您执行此操作,而指针声明则不是吗?

干杯

c

1
推荐指数
1
解决办法
408
查看次数

使用while循环反转C中的字符串

这段代码基本上应该是一个字符串,比如说它是“abc de fgh”,输出应该是

cba
ed
hgf
Run Code Online (Sandbox Code Playgroud)

此处显示的代码确实将字符串放入一行中,但不会反转它们。我在想出那部分以及如何在方法中使用我的参数中的 char* 时遇到了麻烦。任何在正确方向上的帮助都会很棒!

void stringReverse(char* s){

    char* i = 0;
    char* j = strlen(s)-1;
    //in order to swap the characters s[i] and s[j] make a temp
    char* temp;

    while(i < j){
        temp = i;
        i = j;
        j = temp;

        i++;
        j--;
    }
    //end of the while loop means that it reversed everything (no need for if/else)
}
Run Code Online (Sandbox Code Playgroud)

c

1
推荐指数
1
解决办法
1124
查看次数