C 使用指向字符的指针而不是字符数组时出错

C 使用指向字符的指针而不是字符数组时出错,c,arrays,pointers,C,Arrays,Pointers,可能重复: 我在Ubuntu中使用带有C语言的GCC编译器;我有这个计划: 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", wor

可能重复:

我在Ubuntu中使用带有C语言的GCC编译器;我有这个计划:

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);
}

那么有什么区别呢?对于后者,我得到一个
分段错误
错误。

区别在于第一个是有效代码,而第二个是未定义的行为(因为不允许修改字符串文字)。请参阅。

字符1[]=“shoe”创建一个5个字符的数组,并将字符串文本“shoe”复制到其中(可以修改)


char*word2=“鞋”
创建一个指向字符串文本“shoe”(无法修改)的指针。

问题在于您的
char*word2=“shoe”存储在
.rodata
中:

(如果将
shoe
存储在一个变量中,将
foot
存储在另一个变量中,则更容易查看。)

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


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

如果每次有人问我修改
const char*
…@EdS时我都有一美元,但它不是
const char*
。C中的字符串文字不是常量
const
;试图修改它们只是未定义的行为。(它们是C++中的代码> const ),对,这是一个糟糕的设计决策。他们应该是const,但我承认我错过了C标签并假设C++。
$ readelf -p .rodata adum

String dump of section '.rodata':
  [     4]  shoe
  [     9]  %s