簡體   English   中英

在C中類推NULL指針

[英]Typecasting NULL pointer in C

我有一個結構

struct detail {
int id;
uintptr_t init;
// blah blah
};
struct detail info;
info.id = 1;
info.init = (uintptr_t)NULL;

我必須使init成員為NULL。 如果我強制轉換(或不轉發) NULL可能/可能不會發生什么? 如果我直接將它指定為NULL,如info.init = NULL;info.init = NULL; 它是否與運行時錯誤有任何區別。 它匯編得很好。 但是代碼的執行是我主要關注的問題。

謝謝

標准中無法保證如果ptr是空指針,則(uintptr_t)ptr0

如果你不關心空指針和零整數不相等的系統,那么info.init = 0; 很好。

init成員具有整數類型,不能為“null”。 您可以為其指定0 ,或者可以為其分配將空指針轉換為uintptr_t 在幾乎所有的C實現中,這些都是一樣的。 但它並不能保證,並且有一些系統與它不一樣。

NULL可能是空指針,也可能是整數常量0 在后一種情況下, 存在在標准中,一個保證(uintptr_t)(NULL)0 所以可以有info.init = NULL; (void*)(info.init); info.init = NULL; (void*)(info.init); 有未定義的行為。 如果null的整數等值不為0,則不會產生空指針,並且計算無效指針值是UB。

所以,如果你想保證info ,當轉換為指針類型時,會產生一個空指針然后為了真正的可移植性你應該做info.init = (uintptr_t)(void*)(NULL); 您可以通過包含uintptr_t將要轉換為的指針類型而不是void*來為讀者提供額外的線索。 存儲uintptr_t原因很少,因此暗示正在發生的事情可能有助於讀者。

請注意,標准中保證轉換為指針類型的零值常量表達式是空指針。 並不意味着零值非恆定表達,轉換為指針類型,是空指針。 它也不意味着轉換為整數類型的空指針為0.最后兩件事在大多數實現中都是正確的(包括所有“現代”的)。

NULL是一個內置常量,其值與系統上的空指針無關。 將常量值分配給與系統上的指針相同大小(或更大)的int是完全有效的。

我會在這里投票,因為通常不允許指定整數指針並且會產生警告。 當然,使用intptr_t是一個非常好的主意,因為它足夠大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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