2012-05-24 47 views
18

可以聲明一個非常簡單的陣列有10個元素,並使用它的方式:C++中數組允許的最大維數是多少?

int myArray[10]; 
myArray[4] = 3; 
std::cout << myArray[4]; 

或用10x100元素聲明一個二維數組作爲int myArray[10][100];

即使創建更復雜的3-d陣列,int myArray[30][50][70];

我甚至可以去儘可能寫:

int complexArray[4][10][8][11][20][3]; 
complexArray[3][9][5][10][15][3] = 5; 
std::cout << complexArray[3][9][5][10][15][3]; 

所以,聲明數組時可以使用的最大維數是多少?

+16

這是顯而易見的。 –

+6

實際上,你的第二個例子中有一個緩衝區溢出。哎呦。 – Puppy

+7

爲什麼一些結論倒下了?這不是一個錯誤或錯誤的問題。 – Puppy

回答

27

標準建議的實現接受至少256(ISO 14882,B.2),但是它們可支持更少或更多:

限可約束量包括以下的那些或其他人描述。建議將每個數量後面的括號中的數字 作爲該數量的最小值。但是,這些數量僅爲 指南,並未確定是否符合規定。

[...]

- 指針,數組和函數聲明(以任何組合)修飾的算術,結構,聯合或不完整的聲明[256]型。

這在C++ 03和C++ 11中都是一樣的。

-3

寫入數組時的唯一限制是計算機的內存容量。

+3

不正確 - 這實際上不是限制。由於虛擬內存和分頁,一個進程實際上可以處理比系統具有物理內存(儘管緩慢)更多的數據。另一方面,由於內存碎片,進程可以分配的最大陣列可能比其地址空間小得多。 –

4

我的第一篇文章!

值得一提的是,我的系統在靜態分配時只有30個維度,在堆棧上分配時只有19個維度。系統是AMD A10-7700K,64位(8 GB RAM)。使用默認設置在Visual C++ 2013上編譯。

請注意,爲了確定系統上的最大值,請使用具有最小維度大小(2)的最小數據類型(char)。尺寸爲1時沒有限制,因爲尺寸1(在任何尺寸上)都是多餘的,並且不會影響陣列的整體尺寸。數據類型越大或者維度越大,可以擁有的維度就越少。然而,我發現任何一個(並且只有一個)尺寸可以是3,但不是4.

#include<iostream> 
int main() 
{ 
    char a[2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2] = {0}; // ok 
    char b[2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2] = {0}; // fail! 
    static char c[2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2] = {0}; // ok 
    static char d[2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2][2] = {0}; // fail! 

} 
+1

因爲'T'和'T [1]'具有不同的語義,因此1的維數不是多餘的。 – Hurkyl

+0

語義不同,但內存消耗不。但是對於維度1有沒有實際用途? –

相關問題