1

这是关于在将 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

谁能解释一下发生这种情况的原因?

4

4 回答 4

2

你声明了一个指针,但你没有初始化它。它可以取任何值,即不保证为NULL。当然,它可能NULL(0),但同样不能指望它。

未初始化变量的值是不确定的,除非它具有静态存储持续时间。

于 2012-02-10T18:23:41.537 回答
2

您正在读取一个未初始化的变量。那是未定义的行为。基本上,任何事情都可能发生。如果您打开编译器警告,编译器会准确地告诉您。

我怀疑你相信你的局部变量会自动初始化。事实并非如此。您必须在阅读它们之前对其进行初始化。

于 2012-02-10T18:28:57.500 回答
2

auto变量(即未声明的局部变量static),例如ptemp未初始化,因此它们的值是不确定的(本质上,任何位串从先前的操作中留在该特定存储单元中,这可能是也可能不是给定类型)。永远不要尝试取消引用未初始化的指针。

在文件范围(任何功能块之外)或使用static关键字声明的变量初始化如下:

  • 指针初始化为 NULL;
  • 算术类型(整数或浮点数)初始化为 0
  • structs根据前面两条规则递归初始化
  • 联合根据前两条规则递归地初始化它们的第一个命名成员

如果您将声明更改p

static struct node *p;

然后p将被初始化为 NULL。如果您不想声明pstatic,则必须将其初始化为声明的一部分:

struct node *p = NULL;
于 2012-02-10T19:07:25.870 回答
0

您需要提供pamdtemp值 - 因为您没有它们可以包含任何内容。

于 2012-02-10T18:25:20.260 回答