有人可以告诉我这里打印的是“你好”吗?据我所知,局部变量是未初始化的。因此,我认为应该打印其他部分,否则就会发生。请帮忙。
struct buss{
int a;
char b;
};
void main(){
struct buss *p;
if(p==NULL) printf("hello");
else printf("hi");
}
答案 0 :(得分:3)
您没有初始化p
个对象。它的价值是不确定的。
读取未初始化的对象是未定义的行为。未定义的行为意味着任何事情都会发生。任何事情都意味着您的程序也可能崩溃或打印"nose demons"
。
编辑:根据评论中的要求,问题"正在读取未初始化的对象总是未定义的行为?":对于C90,请参阅3.16中未定义行为的定义,对于C11,见6.3.2.1p2和C99,见DR#338中C委员会的回答。
答案 1 :(得分:2)
p
是一个未初始化的指针并指向某处,恰好是NULL
,因此会打印"hello"
。 @Ouah解释了为什么你不应该访问p
。
答案 2 :(得分:1)
您的* p局部变量未初始化,因此它可以随机获取任何值(包括NULL)
此外,在某些条件下,某些编译器可能将此对象初始化为NULL,但标准不要求这样做。所以你最好初始化你的对象。
答案 3 :(得分:1)
严格来说,这是未定义的行为,因为p
未初始化。但出于安全原因,许多操作系统不会在堆栈或堆中提供原始(未初始化的)内存块。所以p
总是是NULL
,在这个简单的例子中(如果你调用了许多子程序,它可能会有所不同)。