c++ - char * arr[5] = {...} 上的访问冲突,这是什么?

标签 c++ c visual-studio gcc segmentation-fault

<分区>

Possible Duplicate:
Modifying C string constants?

你能解释一下为什么我在提到的行上遇到访问冲突吗?我想那是我的进程内存,我可以访问和更改它的内容。

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

最佳答案

您的代码等同于 p[1][2]='A'; 即它想在第二个字符串中设置第三个字符。

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

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

关于c++ - char * arr[5] = {...} 上的访问冲突,这是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4699784/

相关文章:

c++ - 为什么 cout << &r 给出的输出与 cout << (void*)&r 不同?

c - KPIT GCC 将文本字符串分配给特定的链接器部分

visual-studio - 在 Visual Studio 中启动 DotNetNuke 项目的正确方法是什么?

c++ - OpenSSL C API : How to resume TLS connection after program exec()?

c++ - 在类中初始化静态指针

堆栈上的字符数组导致段错误

javascript - 如何绕过 "Visual Studio Just-In-Time Debugger"提示

c# - 如何创建或生成 .mlpd 文件以检查 xamarin 分析器中的应用程序性能

c++ - 可疑情况下的 Clang 警告 : function 'foo' could be declared with attribute 'noreturn' ?

c - 将 int 转换为 size-t 是否可以避免数字溢出?