我不知道如何問這個問題,因為這對我來說有點混亂。我對這段代碼有問題
#include <stdio.h>
#include <stdlib.h>
#define ull unsigned long long
#define SIZE 1000000001
#define min(a,b) ((a<b?a:b))
#define max(a,b) ((a>b?a:b))
int solve(void) {
// unsigned *count = malloc(sizeof(unsigned) * SIZE);
int k;
scanf("%d", &k);
unsigned count[SIZE];
for (ull i = 0; i < SIZE; i ){
count[i] = 0;
}
return 0;
}
int main(void){
unsigned t;
if (scanf("%u", &t) != 1) return 1;
while (t-- > 0){
if (solve() != 0) return 1;
}
}
對我來說,這段代碼給出了段錯誤。
我的觀察是什么
- 它運行良好,直到它處于求解功能。
- 在呼叫求解函式時,它給出了段錯誤。
- 它與洗掉此行無關,會
scanf("%d", &k)給出相同的錯誤 - 但是,如果我們減小 SIZE 值,它將運行良好。
- 我可以做的其他事情是代替在堆疊上創建一個陣列,我可以使用堆,這作業正常。
- 如果我只
count在求解函式中宣告陣列而不是將 k 作為輸入并將陣列的所有值初始化count為 0。我沒有得到任何段錯誤
所以我對此有一些疑問。
- 這是由于陣列的記憶體限制還是由于函式求解的堆疊幀的記憶體限制(或者可能是我找不到的另一個原因)。
- 如果這是由于任何型別的記憶體限制而不是對于程式來說太低了嗎?
- 編譯器如何檢查諸如添加任何型別的列印陳述句之類的錯誤不會在陣列宣告之前運行,因為我在程式到達時遇到段錯誤
solve。所以編譯器不知何故知道它們是代碼的問題,甚至沒有到達那里。 - 特別是第六點,據我所知,在宣告陣列時,它會為陣列保留記憶體。所以通過初始化它我什么都不做,這會增加陣列的大小。那么為什么我在宣告陣列時沒有收到任何型別的錯誤,而我在初始化陣列中的所有這些值時卻遇到了段錯誤
也許我以完全錯誤的方式看待它,但這就是我的想法,所以如果您知道任何原因,請也回答我
uj5u.com熱心網友回復:
這取決于您的作業系統。在 Windows 上,堆疊的典型最大大小為 1MB,而在典型的現代 Linux 上為 8MB,盡管這些值可以通過各種方式進行調整。對我來說,它與其他平臺或其他系統正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/460077.html
上一篇:洗掉購物車中的專案(陣列)php
