C中被const了的类型可以改变吗?
c语言真的是有很多很有趣的地方。现在说的这个问题,是我无意中发现的。现在回想起来,觉得挺有意思的,在这里记录下来。
且看如下代码:
const int a = 123; a = 456
这个代码肯定都能看得出来,编译是不会通过的。
但是我想达到让变量a == 456有什么方法可以吗?
C语言既然号称是自由的语言,我们就有绕过他语法限制的方法咯。
看了如下的代码,你会不会有所疑惑。
这个代码在g++中是可以编译通过的,也就是说我们绕过了语法限制,使得a的值得到了改变。但结果真的是这样的吗?答案是否定的,当你运行这个程序的时候,结果还是123。为了表现这个东西神奇,再看如下代码:
int main() { const int a = 123; int *b = (int*)&a; *b = 456; printf("%x: %d\n", &a, a); printf("%x: %d\n", b, *b); return 0; }
这个程序在这本机是这样输出的:
28ff38: 123
28ff38: 456
这个程序就是输出了两个变量的地址和值。但是从结果上来显示,他们在内存中的地址是一样的,但是值却不一样!奇怪否?我刚接触这个问题的时候,也觉得相当的奇怪,后来我猜测是编译器优化搞的鬼。
为了验证这个问题,我用如下代码测试了一下:
int main() { int c = 123; const int a = c; int *b = (int*)&a; *b = 456; printf("%x: %d\n", &a, a); printf("%x: %d\n", b, *b); return 0; }
这下结果终于对了:)
28ff34: 456
28ff34: 456