这是有效的C吗?没有关于p未初始化的警告

时间:2011-07-13 08:27:27

标签: c gcc

使用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

2 个答案:

答案 0 :(得分:11)

int *p = p;
解析p后立即定义

int *p,但之后仅评估RHS。该陈述相当于

int * p;
p = p;

这在C ++中与隐式构造函数不同,但在纯粹的C中,这就是你所拥有的。未定义的初始值。

就编译器警告而言,这是一个实施质量问题。 gcc没有被“欺骗”,它只是在宽容。

答案 1 :(得分:2)

Valgrind发出关于p未初始化的警告。我猜gcc被欺骗了,应填写错误报告。