炭的大小是1個字節,以及維基百科說:爲什麼的sizeof無符號字符陣列[10]是10
的sizeof用於計算任何數據類型的大小,在 的字節數所要的測量來表示類型。
但是,我可以存儲11字節在unsigned char array[10]
0..10但是當我做sizeof(array)
我得到10字節。有人可以解釋這種行爲嗎?
注:我已經嘗試了本上int數據類型情況下,sizeof(數組)爲40,其中i期望它是44
炭的大小是1個字節,以及維基百科說:爲什麼的sizeof無符號字符陣列[10]是10
的sizeof用於計算任何數據類型的大小,在 的字節數所要的測量來表示類型。
但是,我可以存儲11字節在unsigned char array[10]
0..10但是當我做sizeof(array)
我得到10字節。有人可以解釋這種行爲嗎?
注:我已經嘗試了本上int數據類型情況下,sizeof(數組)爲40,其中i期望它是44
然而,我可以存儲在無符號的字符陣列11個的字節[10]
不,您不能:10不是有效索引array[10]
。數組索引從零到大小減一。
根據C99標準
6.5.3.4.3當[
sizeof
操作者是]應用於具有一個操作數類型char
,unsigned char
,或signed char
,(或合格的版本物)的結果是1.
這就是爲什麼結果將在所有符合標準的平臺上都會達到10個。
不,有效索引將不會0-9
0-10
,它將存儲10
元素不11
,所以sizeof
的結果是正確的。訪問超越指數9
會出界和undefined behavior中,C99 draft standard
有關節是6.5.6/8
,覆蓋指針運算:
[...]如果指針操作數,結果點的元素都相同的數組對象,或者超出數組對象的最後一個元素,則評估不應產生溢出;否則,行爲是不確定的。如果結果指向一個超過數組對象的最後一個元素,則不應將其用作所評估的一元運算符的操作數。
與C++標準明確聲明array has N elements numbered 0 to N-1
不同,您需要深入研究C標準中類似語句的示例。在C99 draft standard
部6.5.2.1/4
,示例是:
int x[3][5];
和它進行到狀態:
這裏x是一個3×5陣列的整數;更準確地說,x是一個由三個元素對象組成的數組,每個元素都是一個由五個整數組成的數組。
它是不確定的行爲? AFAIK使用方括號來取消引用指針的定義很明確,即使對於負指數也是如此。編譯器是否將'char * pointer'與char array [10]不同地對待? –
@WayneUroda如果你認爲它的定義很好,那麼你認爲它的定義是什麼? – sepp2k
C99 6.5.2.1:'下標運算符[] 的定義是E1 [E2]與(*((E1)+(E2)))相同' –
unsigned char array[10];/*Array of 10 elements*/
這意味着
array[0],array[1],array[2],array[3].......array[9]
所以sizeof(array)=10
是正確的。
不,有效索引將爲'0-9'。 –
你可以在10個盒子裏儲存11件東西嗎?這是一個很好的伎倆...... –
這是一個危險的把戲。第十一個盒子被稱爲緩衝區溢出。 – Thilo