我找到了一个意外的"以下代码的行为,它通过derefering其指针修改 static const int :
#include <stdio.h>
static const int a;
int main(int argc, char *argv[])
{
printf("a=%d\n", a);
*((int *) &a) = 120;
printf("a=%d\n", *((volatile *) &a));
printf("a=%d\n", a);
return 0;
}
使用GCC Debian 4.9.2-10编译的程序的输出(以及带有 -Os 的Debian 4.4.5-8)是:
a=0
a=120
a=0
除非使用 volatile 强制转换,否则编译器似乎会优化变量值。在编译期间没有给出警告,我发现程序在Debian 4.4.5-8中使用 -Os 表现不同。实际上,如果没有请求大小优化,它会打印&#34;期望&#34;第三行的值为120。
这是正常行为吗?
提前感谢您的意见
答案 0 :(得分:1)
这是正常行为吗?
不,这是未定义的行为,因为您修改了使用const
限定符定义的对象:
*((int *) &a) = 120;
这意味着无论发生什么,你都不应该做出任何正确或不正确的假设。