C语言中普通指针指向const变量:旧编译器是否支持?
旧版C语言编译器是否允许普通指针指向const变量?
是的,旧版编译器(比如遵循C89标准的早期GCC版本)通常允许这种写法,但一般只会给出警告而非直接报错,而现代编译器会明确抛出警告(甚至转为错误)。
具体原因分析:
- 在C89标准中,将
const变量的地址赋值给非const指针的行为,属于未定义行为的前置操作,但标准并未强制要求编译器报错,仅建议给出诊断信息。早期编译器默认警告等级较低,可能不会提示该问题,或者仅输出轻微警告,导致开发者误以为这种写法合法。 - 从C99标准开始,以及现代编译器(如高版本GCC、Clang)默认启用了更严格的检查规则,会触发
-Wdiscarded-qualifiers警告;如果开启-Werror选项,会直接将警告转为编译错误,这也是你现在遇到报错的原因。
关于你给出的代码:
#include <stdio.h> int main() { const int a = 10; int *ptr = &a; //compile error source.c:6:16: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] *ptr = 50; printf("Value of 'a' is %d", a); return 0; }
即便旧编译器允许这段代码通过编译,其行为也是完全不可靠的:
- 若编译器将
const变量a放入只读存储区,修改*ptr会直接触发段错误; - 若编译器未做优化,可能会修改变量的实际值,但这完全依赖编译器实现,不具备可移植性。
内容的提问来源于stack exchange,提问作者GRTsahil
相关产品推荐
相关产品推荐

