指针数组中未初始化或NULL指针

时间:2014-05-25 12:03:08

标签: c arrays pointers

我有一个指向结构的指针数组。

struct key {          
  int *data;          
};                    

struct key *entry = NULL;
entry = malloc(sizeof(entry));

重新分配了一些次:

node = realloc(node, (length+1)*sizeof(node[0]));
node[length].data = some_int;

在我的程序的另一部分,我想迭代它。我不知道它目前包含了多少元素。

for (i=0; &(node[i]) != NULL; i++)
  length = i;                     

但我有无限循环。这是因为:

(gdb) p node[i]
$1 = {data = 0x0}

它似乎喜欢未初始化的值,但它不是NULL指针。

如何确定数组的结尾?

为什么它不是NULL指针?

2 个答案:

答案 0 :(得分:2)

&(node[i])的地址为node[i]

所以

&(node[i]) != NULL

始终为真,因为 <{strong> node[i]的地址始终NULL不同。

答案 1 :(得分:1)

&(node[i])node + i相同,只要节点不为空且i不为零,这将是非空的。

如果你想标记数组的结尾,我建议总是(重新)分配一个额外的元素并用NULL初始化终止的指针成员。

struct key *temp = realloc(node, (length+2)*sizeof(node[0]));
if(NULL == temp) {  /* Updated as per suggestion from @alk */
  /* Handle error and return */
}
node = temp;
node[length].data = address_of(some_int);
node[length+1].data = NULL;

稍后循环

for (i=0; node[i].data != NULL; i++)
  length = i;

但更好的解决方案是保持length上次用于与node捆绑的realloc。这样您就不需要使用循环来计算它。