为什么这个小C程序会崩溃?

该计划是:

#include  #include  int main(void) { char *a="abc",*ptr; ptr=a; ptr++; *ptr='k'; printf("%c",*ptr); return 0; } 

问题在于

 *ptr='k'; 

线,当我删除它程序正常工作。 但我无法弄清楚原因。

问题是因为您尝试使用以下命令更改字符串文字"abc"

 char *a="abc",*ptr; ptr=a; // ptr points to the 'a'. ptr++; // now it points to the 'b'. *ptr='k'; // now you try to change the 'b' to a 'k'. 

这是未定义的行为。 该标准明确声明您不允许根据第6.4.5 String literals节C99的字符串文字更改字符串文字:

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的。 如果程序试图修改此类数组,则行为未定义。

如果你更换它将工作:

 char *a="abc",*ptr; 

有:

 char a[]="abc",*ptr; 

因为它将字符串文字复制到一个可以安全修改的地方。

因为“abc”是一个常量字符串文字。 然后你指向它的ptr并尝试修改它是未定义的行为。 通常,字符串文字放在一个内存部分,它被映射为只读 – 因此访问冲突。

另见这个问题: 字符串文字:它们去哪里了?

原因是你的字符串"abc"存在于只读的内存区域。 它被链接器放在那里。 你尝试在你的程序中更改它,所有的赌注都关闭了。

这个:

 char *a="abc"; 

是真的:

 const char *a="abc"; 

你不能修改ptr ,它指向与a相同的地址。