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 
}