可能重复:
Why do I get a segmentation fault when writing to a string?
Why do I get a segmentation fault when I try to modify a string constant?
我正在尝试运行以下两个代码,我使用 file2.c 进行分段错误,但 file1.c 我> 我没有犯任何错误。有人可以解释以下代码之间的区别:
file1.c
#include <stdio.h>
int main()
{
int i;
char string[11] = {"HelloThere"};
string[10] = '\0';
for(i =0;i<5;i++)
{
string[i] = 'a';
}
printf("%s\n",string);
}
和:
file2.c中
#include <stdio.h>
int main()
{
int i;
char * string;
string = "HelloThere";
for(i =0;i<5;i++)
{
string[i] = 'a';
}
printf("%s",string);
}
答案 0 :(得分:3)
这是因为作业
char string[11] = {"HelloThere"};
将字符串常量复制到可写内存中,而
char * string = "HelloThere";
将其保留在只读内存中。虽然写入可写存储器是绝对可以的(呃!)写入只读存储器是未定义的行为,并且可能会触发崩溃。
请注意,除非要分配比字符串文字所需的内存更多的内存,否则不需要显式指定字符串的大小:
char string[] = {"HelloThere"}; // <<== The size is empty
答案 1 :(得分:1)
string = "HelloThere";
然后
string[i] = 'a';
是错误的 - 您正在尝试修改字符串文字,但您不能。这会导致未定义的行为,因此任何事情都可能发生,包括崩溃。
然而,
char sring[11] = "HelloThere";
创建一个auto数组(在beforehands之前复制其中的字符串内容)并且这是可写的,允许修改它们的元素。