这是关于C ++中指针的一个小混淆,同时将它们与NULL进行比较。 这是代码:
struct node
{
int data;
struct node *left;
struct node *right;
}
int main()
{
struct node *p;
if(p!= NULL)
printf("line1\n");
else
printf("line2\n");
struct node *temp;
if(temp == NULL)
printf("line3\n");
}
输出:
line2
line3
对于以下代码:
struct node
{
int data;
struct node *left;
struct node *right;
}
int main()
{
struct node *p;
if(p!= NULL)
printf("line1\n");
else
printf("line2\n");
struct node *temp;
}
这是输出:
line1
有人可以解释一下这种情况发生的原因吗?
答案 0 :(得分:2)
您声明了一个指针,但是您没有初始化它。它可以采用任何值,即不保证NULL
。当然,它可以是NULL
(0),但是再次,这是不能指望的。
未初始化变量的值是不确定的,除非它具有静态存储持续时间。
答案 1 :(得分:2)
您正在阅读未初始化的变量。那是未定义的行为。基本上,任何事情都可能发生。如果您打开了编译器警告,编译器就会告诉您这一点。
我怀疑你相信你的局部变量会自动初始化。事实并非如此。您必须在阅读之前对其进行初始化。
答案 2 :(得分:2)
auto
变量(即未声明为static
的局部变量),例如p
和temp
未被初始化,因此它们的值是不确定的(基本上,无论位串是什么)保留在先前操作的特定存储器单元中,其可能是或可能不是给定类型的有效值。切勿尝试取消引用未初始化的指针。
在文件范围(在任何功能块之外)或使用static
关键字声明的变量初始化如下:
如果您将p
的声明更改为
static struct node *p;
然后p
将初始化为NULL。如果您不想要将p
声明为static
,那么您必须将其初始化为声明的一部分:
struct node *p = NULL;
答案 3 :(得分:0)
您需要提供p
和temp
值 - 因为您没有,它们可以包含任何内容。