我具有以下结构:
typedef struct School
{
int numOfStudents;
} School;
例如,如果我有一个结构:
School s;
我想这样检查结构是否为空:
if(s) {
printf("null");
}
这将无法编译,并且错误消息如下:
error: used struct type value where scalar is required
为什么我不能在C中的if语句中检查NULL的结构?
答案 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");
}
注意,尽管指针要么指向某物,要么数据结构是否有效的问题可能要复杂得多,并且不应将其与结构是否存在问题相混淆。已初始化或将每个数据成员设置为零。