C語言陣列放到主函式外面和裡面的區別

2022-09-07 12:12:08 字數 918 閱讀 1364

今天寫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...