2011-08-30 6 views
9

見て、ポインタのデフォルト値。?

typedef struct jig 
    { 
     int *a; 
     int *b; 
    }temp; 

は今ステージ1

temp *b; 
b= (temp*)malloc(sizeof(temp)); 

if(b->a != NULL) 
    printf("a is not null\n"); 
else 
    printf("a is null\n"); 
if(b->b != NULL) 
    printf("b is not null\n"); 
else 
    printf("b is null\n"); 

出力は:今

a is null 
b is null 

ステージ2

temp b; 

if(b.a != NULL) 
    printf("a is not null\n"); 
else 
    printf("a is null\n"); 
if(b.b != NULL) 
    printf("b is not null\n"); 
else 
    printf("b is null\n"); 

出力は次のようになります。

a is not null 
b is not null 

なぜこれが起こっていますか?

+0

初期化されていない変数について、コンパイラの警告が表示されましたか? –

+0

-wallそれは何の警告も表示しません... !!! –

+1

実装関連の結果には依存しないでください。 – Stan

答えて

32

ポインタにはデフォルト値はありません。彼らが持っている価値は、彼らが現在使っている記憶にあった迷惑メールだけです。場合によっては特定のコンパイラがメモリをゼロにすることもありますが、それは標準ではないので、それを考慮しないようにしてください。)mallocからのメモリがNULLであることは偶然でした。まるで他の価値もあったはずです。すべてのポインタをNULLに手動で設定する必要があります。

もう1つの方法として、callocを使用することもできます。これはmallocと同じことですが、メモリブロック内のすべてのビットを0に設定します。しかしこれはスタック変数には役立たないので、自分でNULLを設定する必要があります。

+0

すべての組み込みシステムのメモリ管理でcallocで動作します.. ?? –

+1

@ Mr.32それはあなたが意味するものなら標準的なC関数です。 –

3

チャンス、それは起こっていることです。誰も初期化されていない、非静的なメモリは、任意の値を保持する必要があります。どちらも何かを含むことができます。単にmallocは、第2のケースで

  • メモリがガベージ
  • 含まれているものがスタック上にあったので、(それが0含まれている)、消去ページからメモリ を返したことが起こった最初のケ​​ースで

    +0

    しかし、ステージ2では常にNULLです....私はこれを何度も見てきました。 –

    +0

    @ Mr.32 'b'が静的な記憶域を持っている場合のみです。 – cnicutar

    +0

    私はちょうどtemp bと宣言しました。 –

    7

    これは完全にオペレーティングシステムに依存しますが、ポインタがどのような場合に指し示されるのかは指定されていないので、何も指摘されません。あなたはいつもポインタをNULLに設定する必要があります。

    2

    どちらの場合も、tempの内容は初期化されていない(ランダムな)データになります。 nullまたはnullでなくてもかまいません。どのように一貫して同じ値を取得しても、ドキュメンテーションに必要なものが具体的に記載されていない限り、その値に頼らないでください。