[英]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)ptr
為0
。
如果你不關心空指針和零整數不相等的系統,那么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.