const int与指针操作问题:实际输出与预期不符的原因咨询
为什么修改const变量内存后输出未改变?
问题背景
学习时的书籍指出以下代码运行后会得到预期输出,但在repl.it上运行的实际输出与预期不符,需要解释原因。
实际输出
MAX=999 MAX=999
预期输出
MAX=999 MAX=666
测试代码
#include <stdio.h> #pragma warning(disable : 4996) int main(void) { const int MAX = 999; int *ptr; ptr=(int*)&MAX; *ptr=666; printf("MAX=%d\n",MAX); return 0; }
原因解释
- 编译器常量折叠优化:
const int MAX = 999声明后,编译器会在编译阶段直接把所有直接引用MAX的地方替换成字面量999,而非运行时从内存地址读取值。你通过指针修改的是内存中的值,但printf里的MAX已经被提前替换成999,所以输出不会变化。 - 未定义行为:从C语言标准来看,通过指针修改被
const限定的对象属于未定义行为——编译器可自由处理这种情况,有的环境可能允许修改并输出新值,有的会像repl.it一样因常量折叠保持原值,极端情况下甚至可能导致程序崩溃。
内容的提问来源于stack exchange,提问作者user28006951
相关产品推荐
相关产品推荐

