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!

推薦閱讀: