为什么不能在C中比较结构的NULLness?

时间:2018-10-31 14:13:17

标签: c struct null

我具有以下结构:

typedef struct School
{
    int numOfStudents;
} School;

例如,如果我有一个结构:

School s;

我想这样检查结构是否为空:

if(s) {
    printf("null");
}

这将无法编译,并且错误消息如下:

error: used struct type value where scalar is required

为什么我不能在C中的if语句中检查NULL的结构?

7 个答案:

答案 0 :(得分:7)

在以下情况下:

SELECT CASES_COMMENT FROM CASES_TABLE CT JOIN CASES_PRODUCTS_TABLE CPT ON CT.ID = CPT.CASE_ID JOIN PRODUCTS_TABLE ON PT.ID = CPT.PRODUCT_ID WHERE PRODUCT_CODE IN ('VoIP', 'PSTN', 'IPTV');

School s;绝对不是NULL,因为它不是指针。但是,它是结构的未初始化实例,并且s的值未定义。

答案 1 :(得分:2)

NULL适用于指针类型,而s不是指针,它是School类型的实例

如果您声明s为指向 {em> School的指针,例如

School *s;

然后执行空检查将很有意义:

if ( s )
{
  // s points to a valid instance of School
}

答案 2 :(得分:1)

因为null适用于指针,而s不是指针。

顺便说一句,s是一个自动对象,它位于堆栈上,不能为null。

答案 3 :(得分:1)

NULL是一个特殊的指针值,其定义为不指向任何地方。您无法检查s是否为NULL,因为s不是指针。

如果您要查看s是否已被初始化,则您也不能执行此操作,因为没有特别的值可以告诉您变量已被初始化。例如,未初始化的int可以包含0、1、34634,-265356657或任何其他值。

您最好的选择是用一个已知值初始化变量并检查该值。

School s = { -1 };

if (s.numOfStudents == -1) {
    printf("not used yet\n");
}

答案 4 :(得分:1)

结构由数据元素组成。每个元素可以为null(如果适合于元素的类型),但是该结构本身不能[比较] null,即使它只有一个数据元素。

答案 5 :(得分:1)

NULL仅由指针使用。例如,school *s == NULL之类的东西是有效的,因为s是指向类型school的指针。但是,在您的情况下,s不是指针,因此无法将其与NULL比较。

答案 6 :(得分:1)

人们对指针执行NULL检查以确定指针是否有效。我们将需要调用一个函数来确定struct是否有效,答案取决于确切内容及其含义的知识。例如...

typedef struct
{
    int numOfStudents;
} School;

int null_check(School* item)
{
    /* This test assumes that a School is invalid if it has no students.*/
    return (!item || !item->numOfStudents);
}

/*...*/
School s;
/*...*/
if(null_check(&s)) {
    printf("null");
}

注意,尽管指针要么指向某物,要么数据结构是否有效的问题可能要复杂得多,并且不应将其与结构是否存在问题相混淆。已初始化或将每个数据成员设置为零。