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

时间:2012-01-09 04:57:44

标签: c crash

该计划是:

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

问题在于

*ptr='k';  

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

4 个答案:

答案 0 :(得分:6)

问题是因为您尝试使用以下内容更改字符串文字"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'.

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

  

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

如果你替换它工作:

char *a="abc",*ptr;

使用:

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

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

答案 1 :(得分:0)

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

另请参阅此问题:String literals: Where do they go?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

此:

char *a="abc";

真的是:

const char *a="abc";

您无法修改ptr,它指向与a相同的地址。