2014-09-25 66 views
0

結構指針數組是否自動指向NULL /未被初始化?我認爲不是,但它似乎在以這種方式在下面的代碼行操作:自動指向NULL的結構指針數組?

for (np = hashtab[hash(s)]; np != NULL; np = np->next)

NP是一個結構指針,s是一個字符串。

當循環開始時,hashtab[]中的元素都沒有被初始化。每次運行程序時,循環都會立即終止,因爲hashtab[]包含NULL

完整代碼如下。

struct nlist {  /* table entry: */ 
    struct nlist *next; /* next entry in chain */ 
    char *name;   /* defined name */ 
    char *defn;   /* replacement text */ 
}; 

unsigned hash(char *s) 
{ 
    unsigned hashval; 

    for (hashval = 0; *s != '\0'; s++) 
     hashval = *s + 31 * hashval; 
    return hashval % HASHSIZE; 
} 

/* lookup: look for s in hashtab */ 
struct nlist *lookup(char *s) 
{ 
    struct nlist *np; 
    for (np = hashtab[hash(s)]; np != NULL; np = np->next) 
    if (strcmp(s, np->name) == 0) 
     return np;  /* found */ 
    return NULL;   /* not found */ 
} 
+1

'hashtab'是如何定義的? – 2014-09-25 18:52:54

回答

1

由於hashtab是全球性的,它是用默認值(假設它是一個數組,而不是一個動態分配的指針),包括用於NULL指針類型初始化。這僅適用於宣稱爲static的全局或本地人。

1

那麼,在哪裏定義了hashtab?我沒有在您發佈的代碼中看到它的定義。

如果hashtab數組是靜態存儲持續時間的對象,那麼它肯定會在程序啓動時被初始化爲零。否則,它根本不會被初始化。所有具有靜態存儲持續時間的對象在程序啓動時都是零初始化的。

您發佈的代碼表明hashtab被定義爲外部對象,這可能意味着它確實是一個靜態存儲持續時間的數組。這就解釋了爲什麼它默認情況下用空指針進行初始化。

2

calloc()函數將用零初始化內存。

#include <stdio.h> 
char array[100]; // - initialized by zeroes 
void main(void) 
{ 
    char array2[100]; // - initialized with random values 
    static char array3[100]; // - initialized by zeroes and allocate not in the stack 
}