2016-05-21 34 views
2

私はstructをC言語で読んでいましたが、structが初期化される方法を完全に理解していません。 root->rightNULLに初期化されていない理由を私は理解できない構造体のメンバを初期化

0 
word is NULL 
right is not NULL 

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

struct tnode { 
    char *word; 
    int count; 
    struct tnode *left; 
    struct tnode *right; 
}; 


int main (void) 
{ 
    struct tnode *root; 
    struct tnode tn1; 
    root = &tn1; 
    printf("%d\n", root->count); 

    if (root->word == NULL) 
     printf("word is NULL\n"); 
    else 
     printf("word is not NULL\n"); 

    if (root->right == NULL) 
     printf("rightis NULL\n"); 
    else 
     printf("right is not NULL\n"); 
} 

が出力: 以下のコードを考えてみてください。誰かが光を投げてくれますか?

+1

'static struct tnode * root;'を試して、結果を確認してください。 – sjsam

答えて

8

root->rightNULLに初期化されていない理由を理解できません。

Cは、グローバルに定義された変数のみを初期化するか、またはstaticと宣言します。他のすべての変数は、コードによって明示的に行われていなければ初期化されません。

表示されるコードは、初期化されていない変数を読み取ります。そうすることで、未定義の動作が呼び出される可能性があります。 0またはNULLを見るのはちょうど(悪い)運です。変数には何も格納できません。 C11 Standard (draft) 6.7.9/10から

自動記憶域期間を持つオブジェクトを明示的に初期化されていない場合は、その値が 不定です。静的またはスレッド記憶期間を持つオブジェクトが、明示的に で初期化されていない場合は、

- ポインタ型の場合はNULLポインタに初期化されます。

- 算術型の場合は、(正または符号なし)ゼロに初期化されます。

- 集合体の場合、すべてのメンバーはこれらの規則に従って(再帰的に) で初期化され、パディングはゼロビットに初期化されます。

- 共用体の場合、最初の名前付きメンバはこれらの の規則に従って(再帰的に)初期化され、パディングはゼロビットに初期化されます。

関連する問題