[英]Why doesn't my program seg fault when I dereference a NULL pointer inside of malloc?
我一直使用這種malloc風格
int *rc = 0;
rc = malloc(sizeof(*rc));
但是,即使我調用sizeof(*rc)
我假設rc==0
,並且我取消引用NULL
指針,它也不會出錯。
你並沒有真正取消引用任何東西。 除非是VLA,否則不會評估sizeof
的參數。 語言明確允許將您想要的任何“垃圾”作為sizeof
的參數。 該語言保證它不會評估任何內容,只需對表達式的類型執行編譯時分析。 例如,表達式sizeof i++
保證不會改變i
的值。
該規則唯一的例外是可變長度數組。 VLA的sizeof
結果是運行時值,這意味着參數被計算並且必須有效。
sizeof
運算符實際上並不計算其操作數,它只查看其類型。 *rc
的類型是int
,因此它等同於sizeof (int)
。 這一切都發生在編譯時。
(另外,這不是“malloc內部”。)
你實際上並沒有解引用指針,你要求編譯器提供rc
指向的類型的大小。 在這種情況下, sizeof
在編譯時解析,當沒有指針時。
這相當於sizeof(type of *rc)
(換句話說, sizeof(int)
),而不是sizeof(data stored at the location pointed to by rc)
。 sizeof()
適用於類型 ,而不適用於值。
sizeof從不考慮實際數據,只考慮類型,因此不需要(也沒有意義)對指針進行處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.