如何遍历具有空项的结构数组?

时间:2014-11-09 04:20:18

标签: c arrays struct

我有一个大小为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

2 个答案:

答案 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;
};