今天寫oj時,發現了個小問題,記錄一下。方便後期查詢!oj題:
#include
intmain()
}printf
("%d\n"
,num)
;for
(i=1
;i<=
1000
;i++)}
return0;
}
乍一看,沒毛病。但一執行:然後就瘋狂地debug,結局竟然只需要:對!將陣列移到外面!!!!可是,why???先介紹一下棧區(stack),堆區(heap),資料區(data seg)和**區。在main函式裡面的陣列是開在棧區(stack),在函式外面的是開在資料區的。棧區的記憶體比較小,所以當陣列非常大的時候,就會報錯。假如把陣列放在資料區就不會出現這個問題,因為資料區的記憶體很大。
也就是說,在main函式外面開乙個陣列,他的記憶體分配在資料區里;如果在main函式內部開陣列,記憶體分配在棧區內。一般來說棧區的記憶體是比較小的,所以平常開一些小一點的陣列是沒問題的;但如果題目要求的陣列比較大,那就會出現爆出的問題,程式無法訪問記憶體就會出錯;相對的,資料區的記憶體較大,所以開陣列開在資料區/main函式外面,就不易出現這樣的問題。
這也是為什麼很多部落格和oj題解將陣列開到主函式外面!!!
c語言陣列放在main函式裡面和外面的區別
最近a演算法題的時候碰到一道題 乙個數列前三項都為1,之後每項的值等於前三項之和,求第20193024項的最後4位數字。一開始寫的 如下 結果一直爆 terminated due to signal segmentation fault 11 這個錯誤,改了好久沒改出來。之後在stackoverfl...
C語言函式和主函式的呼叫
在c語言中主函式在呼叫子函式時,會產生相應的棧去存放呼叫子函式時的值,當呼叫完畢時,呼叫子函式所生成的棧則立即銷毀。主函式在呼叫子函式時如果為值傳遞時,則傳過去的引數並不影響主函式中引數的值,如果採用位址傳遞,則在子函式時會改變引數位址所指向的值。note 1 在子函式中生成乙個陣列想要通過返回引數...
C語言之陣列和函式
定義 型別符 陣列名 常量表示式 int a 1 include2 define num 6 3void main 411 1213 for i 1 i 1423 24 25for i 0 i 2629 printf n 30 view code 定義 型別說明符 陣列名 常量表示式 常量表示式 i...