[英]Why can't structs be compared for NULLness in C?
我有以下結構:
typedef struct School
{
int numOfStudents;
} School;
例如,如果我有一個結構:
School s;
我想檢查結構是否為null,如下所示:
if(s) {
printf("null");
}
這將無法編譯,錯誤消息如下:
error: used struct type value where scalar is required
為什么我不能在C中的if語句中檢查結構為NULL?
如果是:
School s;
s
絕對不是NULL,因為它不是指針。 但是,它是一個未初始化的結構實例,並且s.numOfStudents
的值未定義。
NULL
適用於指針類型, s
不是指針,它是School
類型的實例 。
如果你將s
聲明為指向 School
的指針 ,例如
School *s;
然后null檢查是有道理的:
if ( s )
{
// s points to a valid instance of School
}
因為null
適用於指針而s
不是指針。
BTW, s
是一個自動對象,它位於堆棧中,不能為空。
NULL
是一個特殊的指針值,定義為不指向任何位置。 您無法檢查s
是否為NULL
因為s
不是指針。
如果您的目的是查看是否已初始化 s
,則無法執行此操作,因為沒有特殊值可以告訴您變量已初始化。 例如,未初始化的int
可以包含0,1,34634,-265356657或任何其他值。
最好的辦法是用已知值初始化變量並檢查它。
School s = { -1 };
if (s.numOfStudents == -1) {
printf("not used yet\n");
}
結構由數據元素組成。 每個元素都可以為null(如果適用於元素類型),但結構本身不能[比較]為null,即使它只有一個數據元素。
NULL僅由指針使用。 例如, school *s == NULL
類的東西是有效的,因為s
是指向類型school
的指針。 但是在您的情況下, s
不是指針,因此無法與NULL進行比較。
人們對指針執行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");
}
請注意 ,雖然指針指向某個或不指向某個東西,但數據結構是否有效的問題可能要復雜得多,並且不應該與結構是否已初始化或是否已將每個數據成員設置為零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.