我是否可以通過將一個指標memsetting為0來可移植地將其設定為NULL(至少根據POSIX標準)? 甚至可以將包含它的結構體memsetting(在那里它變得真正有用)?
編輯:POSIX在stddef.h(0posix)中規定,NULL應該是(void *) 0,但是這可能還不足以允許memset()。 我忽略了POSIX在這方面是否有其他細節的定義。
uj5u.com熱心網友回復:
在C中,memset(&ptr, 0, sizeof(ptr))不一定與ptr=NULL相同,因為ISO/IEC 9899:1999條款17.7第3段說,NULL
擴展到一個實作定義的空指標常數因此不一定是全零位模式。
Posix沒有一個與C標準不同的保證。然而,下一個修訂草案說,
POSIX還保證任何指標物件,如果其表示方法的所有位都被設定為0,也許是通過memset()設定為0或通過calloc(),將被解釋為一個空指標。由此看來,Posix將保證
memset(&ptr, 0, sizeof(ptr))將產生與ptr=NULL相同的效果(而這在所有現有的實作中很可能已經是這樣了)。然而,這些陳述句不一定會給ptr分配相同的位元模式。需要注意的是,C標準(以及Posix,也有提到的更新)并不保證空指標的位模式是唯一的。因此,原則上
ptr=NULL可以給ptr分配一個與memset(&ptr, 0, sizeof(ptr))不同的位模式,只要這個位模式也是一個空指標。該標準確實保證(條款6.3.2.3第4段):
任何兩個空指標應比較相等。任何兩個空指標應比較相等。
因此,如果
ptr和ptr2都是空指標,那么ptr == ptr2評估為真。然而,memcmp(&ptr, &ptr2, sizeof(ptr))可能不會評估為0。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315420.html
標籤:
上一篇:ElasticSearch對多個嵌套欄位的嵌套查詢的相鄰詞
下一篇:C:用指標靜態初始化復合結構
