C++數組放在main函數內外的區別
先來看一道小題,第十屆藍橋杯省賽C++/B組填空題第三題
試題 C:數列求值
本題總分:10 分
【問題描述】
給定數列 1, 1, 1, 3, 5, 9, 17, …,從第 4 項開始,每項都是前 3 項的和。求第 20190324 項的最後 4 位數字。
【答案提交】
這是一道結果填空的題,你隻需要算出結果後提交即可。本題的結果為一 個 4 位整數(提示:答案的千位不為 0),在提交答案時隻填寫這個整數,填寫多餘的內容將無法得分。
思路
顯然,這題目思路明確清晰,就是不斷計算然後對10000進行模運算得到最後4位整數
錯誤代碼
#include<iostream> using namespace std; const int MOD=10000; int main(){ int a[20190324]={0,1,1,1};//a[0]為0,使得下標與序號一致 for(int i=4;i<20190325;i++){ a[i]=(a[i-3]+a[i-2]+a[i-1])%MOD; } cout<<a[20190324]; return 0;
乍看完全沒啥問題吧,但運行結果卻是下面這樣
很懵,瘋狂debug後,發現原因竟然是:
大數組不能放在main函數裡面,要定義在main函數外面成為全局變量!
正確代碼
#include<iostream> using namespace std; const int MOD=10000; int a[20190324]={0,1,1,1};//a[0]為0,使得下標與序號一致 int main(){ for(int i=4;i<20190325;i++){ a[i]=(a[i-3]+a[i-2]+a[i-1])%MOD; } cout<<a[20190324]; return 0; }
問題分析
那為什麼大數組一定要放在main函數外面而不能放在裡面呢?
原因在於開設數組的區域不同,在運行代碼的時候,操作系統會分配不同的內存區域來運行代碼
棧區:由操作系統自動分配釋放,存放函數的參數值,局部變量的值,不需要時系統會自動清除,內存較小
堆區:由new分配的內存塊,也就是說在代碼中new一個數組,內存由堆區分配;堆區不由編譯器管,由應用程序控制,相當於程序員控制。如果程序員沒有釋放掉,程序結束後,操作系統會自動回收
數據區:也稱全局區或者靜態區,存放全局的東西,比如全局變量,內存較大
代碼區:存放執行代碼的地方
簡而言之,在main函數外面開設一個數組,它的內存分配在數據區裡;而如果在main函數內部開設一個數組,它的內存分配在棧區內。一般來說棧區的內存是比較小的,所以平常開一些小一點的數組是完全沒問題的;但如果題目要求的數組比較大,那就會出現爆滿溢出的情況,程序將無法訪問內存而出錯;相反,數據區的內存較大,就不會出現這樣的問題。這就是為什麼開設大數組一定要放在main函數之外的原因。
總結
到此這篇關於C++數組放在main函數內外的區別的文章就介紹到這瞭,更多相關C++數組內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++ 命名空間 using聲明使用示例詳解
- C++ 程序流程結構詳解
- C和C++的區別詳解
- C++:函數對象,STL提供的函數對象,函數適配器詳解
- C++ 內存分區模型的使用(代碼區、全局區、棧區、堆區、new)