相关疑难解决方法(0)

508
推荐指数
8
解决办法
5万
查看次数

为什么在写入用"char*s"而不是"char s []"初始化的字符串时会出现分段错误?

以下代码在第2行接收seg错误:

char *str = "string";
str[0] = 'z';  // could be also written as *str = 'z'
printf("%s\n", str);
Run Code Online (Sandbox Code Playgroud)

虽然这非常有效:

char str[] = "string";
str[0] = 'z';
printf("%s\n", str);
Run Code Online (Sandbox Code Playgroud)

经过MSVC和GCC测试.

c c-strings segmentation-fault

277
推荐指数
10
解决办法
7万
查看次数

为什么C中的复合文字可以修改

人们通常将"不可修改的"与术语"文字"联系起来

char* str = "Hello World!";
*str = 'B';  // Bus Error!
Run Code Online (Sandbox Code Playgroud)

然而,当使用复合文字时,我很快发现它们是完全可修改的(并且锁定在生成的机器代码上,你会看到它们被推到堆栈上):

char* str = (char[]){"Hello World"};
*str = 'B';  // A-Okay!
Run Code Online (Sandbox Code Playgroud)

我正在编译clang-703.0.29.这两个例子不应该生成完全相同的机器代码吗?如果它是可修改的,复合文字真的是文字吗?

编辑:一个更短的例子是:

"Hello World"[0] = 'B';  // Bus Error!
(char[]){"Hello World"}[0] = 'B';  // Okay!
Run Code Online (Sandbox Code Playgroud)

c c99 literals compound-literals lvalue

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