C语言是否仅对void指针指定任何隐式初始化?

Does C language specify any implicit initialization for void pointers only?

这是我的代码:

int main()
{
    int *p;
    void *x;
    printf("%p\n", p);
    printf("%p\n", x);
    return 0;
}

这将打印:

koraytugay$ ./a.out
0x7fff53b35ad0
0x0
koraytugay$ ./a.out
0x7fff5803fad0
0x0
koraytugay$ ./a.out
0x7fff512c9ad0
0x0
koraytugay$ ./a.out
0x7fff55213ad0
0x0
koraytugay$ ./a.out
0x7fff52dbdad0
0x0

语言中是否对此行为有任何解释?

你问过:

In C, why is a void pointer NULL by declaration but other types contain garbage?

这是用小程序得出的错误结论。函数范围内未初始化的指针获得随机值。您不能依赖它们值中的任何模式。

我觉得,C11标准在这方面已经说的很清楚了。参考第 6.7.9 章第 10 段,

If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.

现在,indeterminate 值是 indeterminate(您在这里指的是垃圾和/或 NULL) .你无法真正知道那里会发生什么。


编辑:

根据评论澄清一下,

"But the void *p seems to be NULL always"

没错。 似乎。就 C 标准而言,没有任何保证(指定)。

请注意:int main(void) 优于 int main()。推荐前者。