簡體   English   中英

為什么C中的NULL不能比較結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM