为什么在这个C程序段错误中写入字符串文字?

Kra*_*ken 5 c

#include<stdio.h>

void main()
{
    char *p="nyks";

    p[2]='n';

    printf("%s",p);
}
Run Code Online (Sandbox Code Playgroud)

这会导致SEGMENTATION FAULT崩溃.有人可以解释原因吗?

Mat*_*hen 15

尝试覆盖字符串文字是未定义的行为.C99§6.4.5/ 6:

如果程序试图修改这样的数组,则行为未定义.

这在附录J.2(未定义的行为)中重申.

如果您改为:

char p[] = "nyks";
Run Code Online (Sandbox Code Playgroud)

您可以分配和初始化自动(堆栈)字符数组.在这种情况下,修改元素是完全正确的.


lin*_*r27 7

标准规定了文字字符串的定义const.你无法改变它.

编译器将文字放在只读内存部分.您可以输出组件并观察它.如果您使用GCC,则通过-s标志完成.它会将字符串放在.rodata节中.

  • 不,在 C 中,字符串文字没有 `const` 类型。然而,给它们写信是未定义的行为。 (2认同)