簡體   English   中英

為什么sizeof(“”)等於1而sizeof(NULL)相當於c語言中的4?

[英]why sizeof(“”) is equivalent to 1 and sizeof(NULL) is equivalent to 4 in c-language?

為什么sizeof("")等於1而sizeof(NULL)相當於c語言中的4?

字符串文字是一個字符數組 *(帶有靜態存儲),它包含文字中的所有字符以及終止符。 數組的大小是元素的大小乘以數組中元素的數量。

文字""是一個由一個值為0 char組成的數組。 類型為char[1]sizeof(char)始終為1; 因此sizeof(char[1])總是一個。

在C中, NULL是實現定義的,通常是((void*)0) 在您的特定實現中void*的大小為4.根據您運行的平台,它可能是不同的數字。 NULL也可以擴展為值0的某種類型的整數,並且您將獲得其大小。

*文字不是指針,數組不是指針,指針在這部分問題中不起作用。

空字符串""具有char[1]類型或“ char數組1”。 正如大多數人所認為的那樣,它不是指針。 它可以衰減成指針,因此每當指向char的指針時,您可以使用char數組,並且數組將衰減為指向其第一個元素的指針。

由於sizeof(char)是1(根據定義),因此我們的sizeof("")sizeof(char[1]) ,它是1 * 1 = 1。

在C中, NULL是“實現定義的空指針常量”(C99§7.17.3)。 “空指針常量”定義為值為0的整數表達式,或者這樣的表達式轉換為void *類型(C99§6.3.2.3.3)。 所以sizeof(NULL)的實際值是實現定義的:你可能得到sizeof(int) ,或者你可能得到sizeof(void*) 在64位系統上,通常有sizeof(int) == 4sizeof(void*) == 8 ,這意味着你不能依賴於sizeof(NULL)

另請注意,大多數C實現將NULL定義為((void*)0) (盡管標准不要求這樣做),而大多數C ++實現只將NULL定義為普通0 這意味着sizeof(NULL)的值可以並且將根據代碼是編譯為C還是C ++而變化 (例如,C和C ++源文件之間共享的頭文件中的代碼)。 所以不要依賴sizeof(NULL)

C中的NULL定義為(void *)0。 由於它是一個指針,因此需要4個字節來存儲它。 並且,“”是1個字節,因為“空”字符串具有EOL字符('\\ 0')。

sizeof(NULL)不是什么,而是指向地址0的指針,32位系統上的指針占用4個字節。

“” - > Cstrings通過約定終止,帶有x'00'null字符,因此字面“”由一個字符x'00'組成,並且具有1個字節的sie。

默認情況下,NULL是一個空指針,在特定的32位計算機上,在不同平台上的大小為4個字節,它可以是1,2,3,4,6或8.甚至可能是5或7但是我從未遇到過40位或56位尋址。 此外,在一些較舊的體系結構中,可能存在與指針相關聯的額外位,以指示數據與指令與設備緩沖存儲等。

暫無
暫無

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

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