相同C代码在Mac与Linux输出不同:Mac上const变量修改未生效原因
问题分析:Mac与Linux平台const变量修改结果差异
首先明确:你的代码存在未定义行为——C标准明确禁止将const限定变量的地址赋值给非const指针并修改其内容,这种情况下编译器和平台可以做出任何符合自身实现的行为,没有统一预期。
造成Mac和Linux结果不同的核心原因是编译器优化策略的差异:
Mac平台(实际使用Clang编译器,即使调用
gcc也是其别名):
Clang默认会对const类型变量执行常量折叠优化——编译阶段就把代码中所有引用test的地方直接替换成字面量10,完全跳过运行时从内存读取变量的步骤。哪怕你通过指针强行修改了内存中test对应的存储值,printf输出的依然是编译时就确定的10。Linux平台(使用GCC编译器):
GCC默认优化等级下,没有对该const变量执行常量折叠,或者将其放在了可读写的内存区域。程序运行时,printf会从内存中读取test的值,而你通过指针修改了这块内存的内容,所以第二次printf输出修改后的1。
额外提醒:永远不要依赖未定义行为的运行结果,编写符合C标准的代码才是可靠的做法。
内容的提问来源于stack exchange,提问作者Lukasz
相关产品推荐
相关产品推荐

