我在Ubuntu中使用GCC编译器和C语言;我有这个程序:
void foo(char *word)
{
//something stupid
*word = 'z';
}
int main()
{
char word1[] = "shoe";
char *word2 = "shoe";
foo(word1);
printf("%s", word1);
foo(word2);
printf("%s", word2);
}
那有什么区别?对于后者,我得到segmentation fault
错误。
答案 0 :(得分:5)
区别在于第一个是有效代码,而第二个是未定义的行为(因为不允许修改字符串文字)。请参阅FAQ。
答案 1 :(得分:3)
char word1[] = "shoe";
创建一个包含5个字符的数组,并将字符串文字“shoe”复制到其中(可以修改)。
char *word2 = "shoe";
创建一个指向字符串文字“shoe”的指针(无法修改)。
答案 2 :(得分:1)
问题是您的char *word2 = "shoe";
存储在.rodata
data section中:
$ readelf -p .rodata adum
String dump of section '.rodata':
[ 4] shoe
[ 9] %s
(如果您将shoe
存储在一个变量中,并且foot
存储在另一个变量中,则会更容易看到。)
允许编译器将字符串常量存储在只读内存中,因为标准不允许修改字符串文字。
你的第一个案例是一个显式初始化的字符数组;标准 允许修改它们,因此它们不会存储在只读部分。