使用gcc(4.5)编译此代码段并尽可能多地启用-Wall,-Wextra,-Wuninitialized类型标记,但不会发出警告:
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
答案 0 :(得分:11)
int *p = p;
解析p
后立即定义 int *p
,但之后仅评估RHS。该陈述相当于
int * p;
p = p;
这在C ++中与隐式构造函数不同,但在纯粹的C中,这就是你所拥有的。未定义的初始值。
就编译器警告而言,这是一个实施质量问题。 gcc没有被“欺骗”,它只是在宽容。
答案 1 :(得分:2)
Valgrind发出关于p未初始化的警告。我猜gcc被欺骗了,应填写错误报告。