使用指向char而不是char数组的错误

时间:2012-01-05 23:05:05

标签: c arrays pointers

  

可能重复:
  Why does simple C code receive segmentation fault?

我在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错误。

3 个答案:

答案 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存储在另一个变量中,则会更容易看到。)

允许编译器将字符串常量存储在只读内存中,因为标准不允许修改字符串文字。

你的第一个案例是一个显式初始化的字符数组;标准 允许修改它们,因此它们不会存储在只读部分。