【发布时间】:2011-07-13 08:27:26
【问题描述】:
使用 gcc (4.5) 和尽可能多的 -Wall、-Wextra、-Wuninitialized 类型标志编译此代码 sn-p 不会给我任何警告:
int main() {
int *p = p;
printf("p = %p\n", (void *)p);
return 0;
}
但是多次运行它会得到这个输出:
p = 0xbe9ff4
p = 0x550ff4
p = 0xeb1ff4
p = 0x4caff4
...等等。
这是怎么回事?
编辑:使用“g++ -Wall”编译反而会给我警告:
In function ‘int main()’: warning: ‘p’ is used uninitialized in this function
【问题讨论】:
-
看来你欺骗了编译器...
-
我以前在某个地方见过这个。我不知道它是否有效,但肯定是未定义的行为。
-
调用一个接受可变数量参数但范围内没有原型的函数是 UB。你的编译器可以为所欲为
-
@pmg:我认为更多的是关于自初始化。
-
它在 C++ 中变得更好:stackoverflow.com/questions/2600152/…