您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關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函數內外的區別就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。