簡體   English   中英

當我取消引用malloc中的NULL指針時,為什么我的程序不會出錯?

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

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