我如何检查另一个结构中的结构是否为空?

时间:2015-03-22 19:13:21

标签: c struct

以下是我的两个结构:

typedef struct simple_command_t {
    char * in, *out, *err;
    char **tokens;
    int builtin;
} simple_command;

typedef struct command_t {
    struct command_t *cmd1, *cmd2;
    simple_command* scmd;
    char oper[2];
} command;

以下是我正在使用的代码:

int main() {
    command *check1;

    if ((check1 -> scmd -> tokens) == NULL){
        printf("tokens are null");
    }

    return 0;
}

因为我读过你无法检查结构是否为NULL我试过检查空结构内部的成员。不幸的是,到目前为止我尝试过的一切都给了我段错误。有什么问题?

1 个答案:

答案 0 :(得分:4)

没有&#34;空&#34;结构。 (短语&#34;空结构&#34;如果C允许没有成员的结构,但它没有,并且那不是你所指的那个,那就没有意义。)< / p>

我认为您尝试做的是检查结构是否已经初始化,通过初始化程序或赋值。没有办法做到这一点。

这是一个更简单的例子:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int *ptr;
    /* code that may or may not initialize ptr */
    if (<ptr has been initialized>) {
        printf("ptr = %p, *ptr = %d\n", (void*)ptr, *ptr);
    }
    else {
        fprintf(stderr, "ptr is uninitialized\n");
        exit(EXIT_FAILURE);
    }
}

无法编写条件<ptr has been initialized>。由于ptr不是static对象,因此其初始值不一定是空指针或任何其他特定值;这是不确定的垃圾。巧合的是,它可能恰好包含一个有效的地址;没有办法区分这种可能性和故意存储在ptr中的实际有效值。

确定ptr是否已初始化的唯一可靠方法是初始化它:

int *ptr = NULL;

同样的推理适用于您的示例。您定义一个指针对象:

command *check1;

它在一个函数中定义,它不是static,所以它的初始值是不确定的垃圾。只需读取指针的值:

if (check1 == NULL) ...

有未定义的行为;即使它没有,比较的结果也不会告诉你任何有用的东西。您必须仔细编写代码,以便在为其分配已知值之前永远不要尝试使用check1的值。最简单的方法就是初始化它:

command *check1 = NULL;

如果您将其初始化为NULL,那么它并不指向任何内容;没有要测试的结构对象。您可以创建结构并将其地址分配给check1

check1 = malloc(sizeof *check1);

现在check1有一个有效值(可能仍然是malloc的空指针失败;总是检查一下)。如果malloc成功,check1指向一个结构对象,其值本身就是不确定的垃圾。应用于check1的相同注意事项现在适用于结构对象*check1及其每个成员。

一种常见的方法是定义一个创建结构对象并正确初始化其所有成员的函数。