c - 修改只读内存会发生什么?

标签 c compiler-construction constants c99 undefined-behavior

是否在所有情况下都以只读方式存储由 const 限定的标识符? 还是会在运行时确定?当我要写入“只读”内存时,究竟会发生什么和/或可能发生什么。

const char **cpp;
char *p;
const char c = 'A';
cpp = &p;
*cpp = &c;
*p = 0;

这段代码在任何情况下都会修改 RO 内存吗?还是这只是因为每次我执行它都不是 RO 内存而起作用? 如果是这样,如果 char 存储在 RO 内存中并且我正在执行这段代码,会发生什么情况? 行为是未定义的,这甚至不是问题。但是这段代码是可执行的。 所以我的问题是:修改只读内存会发生什么?

最佳答案

基本上,这取决于编译器。 char 很可能会进入堆栈并且不会是只读的(因此,const 将意味着类型转换困惑,可执行文件中没有任何内容)。堆栈永远不是只读的。

如果您将一些 const 定义为全局的,它很可能会进入 DATA 段,该段也不是只读的。所以你会再次得到它所有的工作。虽然我可以想象编译器将所有常量放入一个具有只读访问权限的特殊段,在这种情况下,您将遇到常见的访问冲突/段错误。

此外,您可能有一个聪明的编译器,它会优化整个代码并用它的值替换任何出现的 const 变量名,在这种情况下,没有任何关于修改这个变量的信息。好吧,很可能编译器足够聪明,可以看到 &c 来理解变量必须存储在某处。

注意多个最有可能可能。未定义的行为就是未定义的行为,所以这个答案可以理解为我们不知道会发生什么

关于c - 修改只读内存会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18269314/

相关文章:

C - 使用 fscanf 从文件中读取 '-1'

c - 在 C 中从另一个函数调用一个函数时出错

java - 编译器(或 JVM)会知道优化这段代码吗?我该如何检查?

function - Julia 中局部变量不受支持的 `const` 声明

具有指针的结构的 const 正确性

c connect() 错误 - 参数无效

Javassist 与。 Java 编译器 API

python - 为什么 Psyco 使用大量内存?

arrays - 是否可以单独声明 const 数组项值

C:使用指向 uint8_t[] 的指针时遇到一些问题