我有一个大小为10的结构数组,其中只分配了几个项目,我怎么知道迭代的项目是否为NULL?
struct child
{
char *father;
char *mother;
};
struct child cont[10];
int i = 0;
memset(cont, 0, sizeof cont);
for (i = 0; i < 10; i++)
{
if (cont[i] == NULL) break; // Error
else //do something....
}
上面的代码抛出错误:used struct type value where scalar is required
!
答案 0 :(得分:2)
如注释中所述,初始化指向NULL
的指针允许您按照尝试的方式测试值。以下是使用while
循环测试两个father & mother
字符串值的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct child
{
char *father;
char *mother;
};
int main () {
struct child cont[10] = {{0}};
int i = 0;
memset(cont, 0, sizeof cont);
cont[0].father = strdup ("Mark");
cont[0].mother = strdup ("Lisa");
cont[1].father = strdup ("Tom");
cont[1].mother = strdup ("Fran");
while (cont[i].father && cont[i].mother)
{
printf ("cont[%d]\n father: %s\n mother: %s\n\n",
i, cont[i].father, cont[i].mother);
i++;
}
/* free memory allocated by strdup here */
return 0;
}
<强>输出:强>
$ ./bin/structptr
cont[0]
father: Mark
mother: Lisa
cont[1]
father: Tom
mother: Fran
指向结构的指针数组
是的,您可以创建一个指向struct的指针数组,然后根据需要分配内存。这允许您测试if (cont[i])
。本质上你做的是同样的事情,但在第一种情况下,你声明了10个结构。在这种情况下,你永远不能只测试cont[i]
,因为它不是一个指针(更不用说它总是有一个地址,字符串是否被填充)。
在这种情况下,您创建10个指向所有设置为NULL的结构的指针(通过使用calloc
而不是malloc
来初始化它们)。当你实际使用10中的一个时,你为struct分配内存,给它一个地址,在它之前是NULL。这允许您迭代10个指针以找出正在使用的指针。这是一种非常灵活的技术,可以应用于大量不同的数据结构。我希望它有所帮助。这是一个例子(相同的输出):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXS 10
struct child
{
char *father;
char *mother;
};
int main () {
/* create MAXS (10) pointers to child set to NULL */
struct child **cont = calloc (MAXS, sizeof(struct child*));
int i = 0;
cont[0] = malloc (sizeof(struct child)); /* allocate as needed */
cont[0]-> father = strdup ("Mark");
cont[0]-> mother = strdup ("Lisa");
cont[1] = malloc (sizeof(struct child)); /* allocate as needed */
cont[1]-> father = strdup ("Tom");
cont[1]-> mother = strdup ("Fran");
while (cont[i]) /* now simply test if pointer is not NULL */
{
/* you can check father/mother individually if desired
here we simply rely on printf outputting (null) if
either father or mother does not point to a string */
printf ("\ncont[%d]\n father: %s\n mother: %s\n",
i, cont[i]-> father, cont[i]-> mother);
i++;
}
/* free memory allocated to cont & by strdup here */
return 0;
}
答案 1 :(得分:1)
在您的代码中cont
不是指针,因此对NULL
进行检查是不对的。
正如您在代码中创建数组时所知,您已经为结构变量分配了内存,即使您可能使用也可能不使用它。
所以你的问题是“我怎么知道我迭代的项目是否为NULL?”毫无意义。
如果要检查是否已填充结构成员的值,请在结构中再添加一个字段,以通知是否填充了结构成员。
struct child
{
boolean is_valid;
char *father;
char *mother;
};