例如我下面寫的10乘以10的2維陣列,當我把它改成1000乘以1000時就會出錯,請問一下該怎樣做才能跑超大的陣列?我大概要用到1萬乘以1萬的陣列才夠用吧>"<
-----------------------------------------------------------------------------------------------
參考用的範例:
#include
#include
#include
int main()
{
srand((unsigned)time(NULL));
int x,y,labw,labl,randnum;
labw=labl=10;
int p[labl][labw];
for (y=0;y
for (x=0;x
randnum=rand()%10;
p[y][x]=randnum;
/*printf(" %d",p[y][x]);這行是寫好玩的,我的目的並沒有要他顯示出陣列來*/
printf(" %d",p[y][x]);
}//x
printf("\n");
}//y
system("PAUSE");
}
2005-10-17 16:04:10 · 3 個解答 · 發問者 Anonymous in 電腦與網際網路 ➔ 程式設計
簡單的講, 你遇到的錯誤是stack overflow或stack overrun. 在執行每個程式的時後, 每個程式都有它自己的stack. 那個stack是個有限的記憶體空間, 如果不夠用的話你就會發生stack overflow或stack overrun的問題. 請到http://support.microsoft.com/?kbid=145799那裡有微軟對此之解釋.你遇到這錯誤是因為int p[labl][labw]的記憶體來自stack, 而你把labl和labw設為1000. 所以p的大小是1000*1000*sizeof(int) = 1000*1000*4 = 4,000,000. 太大了.深入一點在C++裡, int p[labl][labw], 這種陣列是屬於在動態陣列和靜態陣列之間的一種陣列. 原因是此陣列讓你在執行時宣告其大小(靜態陣列要在寫時宣告其大小)但宣告其大小過後卻不能改變其大小(動態陣列可改). 在電腦裡有兩種記憶體, 一是stack, 另一種是heap. stack是所有變數所在的地方. heap是所有new和malloc()回傳的記憶體所在的地方. 一般來講, 靜態陣列是存在於stack而動態陣列是存在於heap. 而這種陣列的記憶體是存在於stack. 當你把labl和labw設為1000時, p的大小是1000*1000*sizeof(int) = 1000*1000*4 = 4,000,000. 所以當在執行這程式時當執行到int p[labl][labw], 電腦要從stack中拿出4,000,000個記憶體時因stack裡沒這麼多記憶體, 所以出錯. 如果你改成用動態陣列則無此問題. 因動態陣列是用heap而不是stack. heap比stack大. 不過雖然heap比stack大, 但仍有其限制.懂不懂?不懂請再問.------------------------------------------------------------------在kernel space不可能超過heap的極限的. 因在將近heap的極限時會thrashing(電腦會變的很慢). 不過在user space(你在user space), 也很難超過. 對初學者來說根本不可能. 因為heap的極限跟你的paging space和physical memory有關. 若將近heap的極限時也會thrashing(電腦會變的很慢).例:你若執行以下程式之後你的電腦會慢下來.#include
2005-10-18 03:14:32 · answer #1 · answered by 龍 7 · 0⤊ 0⤋
我想你可以用MappingFile 來試看看.
2008-06-17 22:03:37 · answer #2 · answered by 阿安 1 · 0⤊ 0⤋
那再請問一下,如果要寫更大的陣列,大到超越heap的極限的話又該怎麼做呢??
2005-10-18 06:11:46 · answer #3 · answered by Anonymous · 0⤊ 0⤋