You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:42:15