访问违规char*arr [5] = {...},这是什么?

Ami*_*deh 0 c c++ gcc segmentation-fault visual-studio

可能重复:
修改C字符串常量?

你能解释为什么我在上述线路上遇到访问冲突吗?我猜这是我的进程内存,我可以访问和更改它的内容.

#include <stdio.h>

int main()
{
    char* list[5]={"An","exam","on","Hall oween","night!!!!"};
    char **p;
    p=list;
    *(*(p+1)+2)='A'; //  <==== Access vioalation here
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 5

你的代码相当于p[1][2]='A';ie它想要在第二个字符串中设置第三个char.

但由于字符串是字符串文字,因此它们是不可变的,当您尝试修改其内容时会出现未定义的行为.特别是它们可以位于只读存储器中.在这种情况下,您会收到访问冲突.

通常,可执行文件由代码,全局变量和常量的不同部分组成.可执行文件被映射到进程中,内存访问权限被设置为可执行文件中声明的内容.通常,代码设置为ReadExecute,全局变量设置为ReadWrite,常量设置为Read.
然后,CPU强制执行这些内存访问设置(仅在64位CPU上执行).您可以使用VirtualProtect手动更改内存保护.请注意,它只有页面粒度.