修改const修饰的内存未报错却正常运行,这段C代码存在什么问题?
代码问题解析
首先贴出格式化后的代码:
#include<stdio.h> int main() { int const x = 5; int *y; printf("x = %d\n",x); y = &x; *y = 10; printf("x = %d , y = %d\n",x,*y); return(0); }
这段代码能修改const变量的值,本质是违反了C语言的const语义,属于未定义行为,并非语言允许的合法操作,具体原因如下:
const的核心作用是编译期约束:它告诉编译器“程序员不会通过这个变量名修改其值”,编译器会基于这个假设做优化(比如把x的常量值直接嵌入代码,而非每次读取内存),但它不会强制把变量所在内存设为只读(局部const变量通常存在栈上,本身是可写内存)。- 代码中
y = &x这一步,是把const int*类型的指针隐式转换成了int*,绕过了编译器的const检查。后续通过*y = 10修改内存值,属于强行违反之前的承诺,这种行为是标准C明确规定的未定义行为。 - 你当前看到“值被成功修改”只是未定义行为的一种表现,不同场景下结果可能完全不同:比如开启编译器优化后,第二个
printf里的x可能依然输出5(因为编译器直接把x替换成了常量值);有些编译器开启警告后会直接提示指针类型转换丢弃const限定符的问题。
内容的提问来源于stack exchange,提问作者Naman Puri
相关产品推荐
相关产品推荐

