#include <stdio.h>
int main()
{
const int a=1;
printf("a's address is %p\r\n",&a);
printf("input a's address\r\n");
int *p=NULL;
//here let p point to a;
scanf("%p",&p);
printf("p point to %p\r\n",p);
*p=100;
// I suppose a will be 100, but acturlly a is still 1...
printf("a's value is %d\r\n",a);
printf("*p's value is %d\r\n",*p);
return 0;
}
为什么a
仍然是1
而不是100
?
但如果我将a
声明为:
int a =1;
有效!
那么,怎么回事?
答案 0 :(得分:2)
您的代码中有几个地方可以调用未定义的行为,这意味着任何事情都可能发生。 a
可以是1
,100
或"puppy"
。
首先,你不能做
scanf("%p",&p);
printf("p point to %p\r\n",p);
*p=100;
因为你可能没有那段记忆。即使你这样做,写信也许是违法的。就像这样的情况。
如果您这样做(更改a
地址处的值)或使用const_cast
然后尝试修改a
,则会出现另一个未定义行为的实例。您承诺a
是const
- 请勿更改。
结果是UB并且行为可能发生,因为编译器将printf("a's value is %d\r\n",a);
优化为简单的printf("a's value is %d\r\n",1);
,因为它相信你不会修改a
(对他的羞耻) )。
答案 1 :(得分:0)
当您将a
声明为const
时,编译器可以自由地假设它无法更改。您合成指向它的指针并尝试修改它并不重要,因为(显然)您的编译器在a
时优化了const
的实际负载。
答案 2 :(得分:0)
const
关键字指定变量的值是常量,并告诉编译器阻止程序员修改它。