IProgramming - momodi's Blog

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