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

初期化されていない変数を読み取っています。それは未定義の振る舞いです。基本的に、何でも起こり得ます。コンパイラの警告をオンにした場合、コンパイラはまさにそのことを通知します。

ローカル変数は自動的に初期化されると思います。そうではありません。それらを読み取る前に、それらを初期化する必要があります。

于 2012-02-10T18:28:57.500 に答える
2

ポインタを宣言しますが、初期化しません。任意の値を取る可能性があります。つまり、であることが保証されているわけではありませんNULL。もちろん、それNULL(0)である可能性がありますが、繰り返しになりますが、それは期待できません 。

初期化されていない変数の値は、静的な保存期間がない限り不確定です。

于 2012-02-10T18:23:41.537 に答える
2

autoおよびなどの変数(つまり、宣言されていないローカル変数static)は初期化されないままであるため、それらの値は不確定です(基本的に、前の操作からその特定のメモリセルに残っているビット文字列は、与えられたタイプ)。初期化されていないポインタを逆参照しようとしないでください。ptemp

ファイルスコープ(関数ブロック外)またはstaticキーワードで宣言された変数は、次のように初期化されます。

  • ポインタはNULLに初期化されます。
  • 算術型(整数または浮動小数点)は0に初期化されます
  • 構造体は、前の2つのルールに従って再帰的に初期化されます
  • ユニオンの最初の名前付きメンバーは、最初の2つのルールに従って再帰的に初期化されます

pの宣言をに変更した場合

static struct node *p;

その後p、NULLに初期化されます。として宣言したくない場合は、宣言の一部として初期化する必要があります。pstatic

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

pあなたはamdtemp値を与える必要があります-あなたが持っていないので、それらは何も含むことができません。

于 2012-02-10T18:25:20.260 に答える