我有一个指向结构的指针数组。
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
指针?
答案 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。这样您就不需要使用循环来计算它。