2013-08-04 79 views
1

炭的大小是1個字節,以及維基百科說:爲什麼的sizeof無符號字符陣列[10]是10

的sizeof用於計算任何數據類型的大小,在 的字節數所要的測量來表示類型。

但是,我可以存儲11字節unsigned char array[10] 0..10但是當我做sizeof(array)我得到10字節。有人可以解釋這種行爲嗎?

注:我已經嘗試了本上int數據類型情況下,sizeof(數組)爲40,其中i期望它是44

+8

不,有效索引將爲'0-9'。 –

+14

你可以在10個盒子裏儲存11件東西嗎?這是一個很好的伎倆...... –

+11

這是一個危險的把戲。第十一個盒子被稱爲緩衝區溢出。 – Thilo

回答

18

然而,我可以存儲在無符號的字符陣列11個的字節[10]

不,您不能:10不是有效索引array[10]。數組索引從零到大小減一。

根據C99標準

6.5.3.4.3當[sizeof操作者是]應用於具有一個操作數類型charunsigned char,或signed char,(或合格的版本物)的結果是1.

這就是爲什麼結果將在所有符合標準的平臺上都會達到10個。

+5

+1。 '數組[10]'有十個插槽。 0到9.在'C'你可以超越界限,但你真的不應該...... – Thilo

+2

「但你不應該」並不完全削減它。你不能沒有別的東西。操作系統將終止你的程序,否則你將會搞亂你以後可能想用於原始目的的內存。 – xaxxon

+6

@xaxxon:或者更糟的是,沒有什麼會出錯的(直到你向一個重要客戶演示程序)。 –

7

不,有效索引將不會0-90-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 standard6.5.2.1/4,示例是:

int x[3][5]; 

和它進行到狀態:

這裏x是一個3×5陣列的整數;更準確地說,x是一個由三個元素對象組成的數組,每個元素都是一個由五個整數組成的數組。

+0

它是不確定的行爲? AFAIK使用方括號來取消引用指針的定義很明確,即使對於負指數也是如此。編譯器是否將'char * pointer'與char array [10]不同地對待? –

+0

@WayneUroda如果你認爲它的定義很好,那麼你認爲它的定義是什麼? – sepp2k

+0

C99 6.5.2.1:'下標運算符[] 的定義是E1 [E2]與(*((E1)+(E2)))相同' –

1
unsigned char array[10];/*Array of 10 elements*/ 

這意味着

array[0],array[1],array[2],array[3].......array[9] 

所以sizeof(array)=10是正確的。