2

谁能告诉我这里是如何打印“你好”的?据我所知,局部变量未初始化。因此,我认为应该打印 else 部分,但它正在以其他方式发生。请帮忙。

struct buss{ 
int a;
char b;
};


void main(){

struct buss *p;

if(p==NULL) printf("hello");

else printf("hi");

}
4

4 回答 4

3

你没有初始化p对象。它的价值是不确定的。

读取未初始化的对象是未定义的行为。未定义的行为意味着任何事情都可能发生。任何事情都意味着您的程序也可能会崩溃或打印"nose demons"

编辑:根据评论中的要求,对于“读取未初始化的对象是否总是未定义的行为?”的问题:对于 C90,请参阅未定义行为定义中的 3.16,对于 C11,请参阅 6.3.2.1p2,对于 C99,请参阅 C委员会在DR#338中的回答。

于 2012-10-24T19:24:30.483 回答
2

p是一个未初始化的指针,指向某个地方,恰好是NULL,因此"hello"被打印。@Ouah 解释了为什么你不应该访问p.

于 2012-10-24T19:24:40.907 回答
1

您的 *p 局部变量未初始化,因此它可以随机获取任何值(包括 NULL)

此外,在某些情况下,一些编译器可能会将此对象初始化为 NULL,但这不是标准所要求的。所以你最好初始化你的对象。

于 2012-10-24T19:25:11.553 回答
1

严格来说,这是未定义的行为,因为p没有初始化。但出于安全原因,许多操作系统不会在堆栈或堆中提供原始(未初始化)内存块。在这个简单的示例中,总是如此p(如果您调用了许多子例程,它可能会有所不同)。NULL

于 2012-10-24T19:33:58.940 回答