對于下面的簡單代碼,每當我輸入值 200,000(或任何其他高值)時,程式就會崩潰:
long size;
printf("Enter the size of the array to be sorted: ");
scanf("%ld",&size);
誰能告訴我為什么?根據我的資訊,long 的范圍遠大于 200,000
TIA
編輯:上一段代碼后面是那些宣告。
int arrMerge[size];
int arrQuick[size];
int arrSelect[size];
int arrInsert[size];
當我評論除那些行(和上面的行)之外的整個程式時,它已經崩潰了。給出了以下終止訊息:
行程回傳 -1073741571 (0xC00000FD) 執行時間:2.419 s 按任意鍵繼續。
uj5u.com熱心網友回復:
根據此 Microsoft 檔案,狀態代碼0xC00000FD代表STATUS_STACK_OVERFLOW. 您的程式因堆疊溢位而失敗。
默認情況下,Windows 程式的最大堆疊大小約為 1 兆位元組。如果你輸入 number 200000,那么你的變長陣列會超過這個限制,導致堆疊溢位。
您可能需要考慮在堆而不是堆疊上為陣列分配記憶體,例如使用函式malloc. 堆沒有最多只能分配一個兆位元組的限制。它能夠存盤更多的資料。
uj5u.com熱心網友回復:
size設定為 200,000之后,這些定義:
int arrMerge[size];
int arrQuick[size];
int arrSelect[size];
int arrInsert[size];
創建具有自動存盤持續時間和大小為 800,000 位元組的陣列,假設int是 4 個位元組,這在今天很常見。總共有 3.2 MB。
自動存盤持續時間通常使用堆疊實作(優化效果除外),默認堆疊大小在 macOS 上為 8 MiB,在 Linux 上為 2 MiB,在 Microsoft Windows 上為 1 MiB。1因此,陣列超出了為堆疊設定的空間,程式崩潰。
腳注
1 “MB”代表兆位元組,1,000,000 位元組。“MiB”代表 Mebibyte,2 20位元組 = 1,048,576 位元組。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/448210.html
下一篇:printf-C中的實作
