1. 程式人生 > >C語言 全域性變數和區域性變數的大小限制(關於堆疊的劃定)

C語言 全域性變數和區域性變數的大小限制(關於堆疊的劃定)

下午做最長公共子序列的時候遇到的問題,問了felix後恍然大悟...看程式碼

#include <stdio.h>
int main(){
int a[1000000];//區域性變數
return 0;
}

編譯執行後發現溢位錯誤。

#include <stdio.h>
int a[1000000];//全域性變數
int main(){
return 0;
}

編譯執行後正常。

在解釋原因前我們先看一下一個由C/C++編譯的程式佔用的記憶體分為幾個部分:

1、棧區(stack sagment):由編譯器自動分配釋放,存放函式的引數的值,區域性變數的值等。在Windows下,棧是向低地址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。

2、堆區(heap sagment) : 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由系統回收 。它與資料結構中的堆是兩回事。堆是向高地址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用連結串列來儲存的空閒記憶體地址的,自然是不連續的,而連結串列的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

3、全域性區(靜態區)(data sagment):全域性變數和靜態變數的儲存區域是在一起的,程式結束後由系統釋放。資料區的大小由系統限定,一般很大。

4、文字常量區:常量字串就是放在這裡的, 程式結束後由系統釋放。

5、程式程式碼區:存放函式體的二進位制程式碼。

綜上所述,區域性變數空間是很小的,我們開一個a[1000000]就會導致棧溢位;而全域性變數空間在Win 32bit 下可以達到4GB,因此不會溢位。

相關推薦

C語言 全域性變數區域性變數大小限制(關於堆疊劃定)

下午做最長公共子序列的時候遇到的問題,問了felix後恍然大悟...看程式碼 #include <stdio.h> int main(){ int a[1000000];//區域性變數 return 0; } 編譯執行後發現溢位錯誤。 #include <

c語言全域性變數區域性變數問題彙總(轉)

1、區域性變數能否和全域性變數重名? 答:能,區域性會遮蔽全域性。要用全域性變數,需要使用"::" 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同一個函式內可以定義多個同名的區域性變數,比如在兩

C語言全域性變數區域性變數總結

————————————————————————————————————————————————————————————————————————————— 只有不斷的學習,不斷的進步,才能不被替代! 只有你的不可替代性才決定你的價值! -----2016年11月18

51微控制器C語言程式設計雜談基礎----全域性變數區域性變數

<  部落格宗旨:文章短,時間短,不考驗耐力    > 我記著我在開始編寫51微控制器程式的時候,老是在思考一個問題:怎麼把一個函式中的值傳到另一個函式中去呢???讓我痛不堪言。雖然簡單,但是在那個時候我還是不知道的。 全域性變數:就是在整個工程都可以使用

c語言全域性變數區域性變數

全域性變數: (1)在函式外定義 (2)在全域性可見 (3)一般在程式頂部定義 (4)存放在記憶體的全域性資料區 (5)如在定義時未初始化,則其值為0 (6)如果一個函式修改了全域性變數,則所有其他的函式都會看到修改後的變數 區域性變數: (1)

【轉載】c語言全域性變數區域性變數問題彙總

1、關鍵字static的作用是什麼?定義靜態變數 2、static有什麼用途?網上答案: 1).限制變數的作用域(在程式的整個執行期間都不釋放) 2).設定變數的儲存域(儲存在靜態儲存區內) 譚浩強C語言page180: (1)對區域性變數用static宣告,則為該變數分

C/C++ 全域性變數區域性變數在記憶體裡的區別?堆

一、預備知識—程式的記憶體分配  一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分  1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧,如果還不清楚,那麼就把它想成陣列,它的記憶體分

C/C++關於全域性變數區域性變數初始化與不初始化的區別

在C語言裡,全域性變數如果不初始化的話,預設為0,也就是說在全域性空間裡:int x =0; 跟 int x; 的效果看起來是一樣的。但其實這裡面的差別很大,強烈建議大家所有的全域性變數都要初始化,他們的主要差別如下: 編譯器在編譯的時候針對這兩種情況會產生兩種符號

C/C++全域性變數區域性變數作用域問題

  這是一個作用域的問題。一個宣告將一個名字引進一個作用域;區域性變數(通常在函式中定義)的作用域是從宣告的那一點開始,直到這個宣告所在的塊結束為止(一個塊就是由{}圍起來的一段程式碼)。全域性變數(在所有函式、類、名稱空間之外定義)的作用域從宣告的那一點開始,直到這個宣

Python3 全域性變數區域性變數的使用

name='lhf' def change_name(): print('我的名字',name) change_name() def change_name(): name='帥了一筆' print('我的名字',name) change_name() print(name) d

JS 變數函式提升 全域性變數區域性變數

1. var a = 10; function test() { a = 100; console.log(a); console.log(this.a); var a; console.log(a); } test();//100 10 100 =&

Python千萬要注意的全域性變數區域性變數問題

1、直接在函式中呼叫全域性變數 m = 100 def fun(): print("m1:",m) fun() print("m2:", m)  輸出: 2、函式體內呼叫與全域性變數同名的區域性變數 m = 100 def fun(): m = 50

python--全域性變數區域性變數

區域性變數: 是在函式內部定義的變數,只能在函式內部使用 函式執行結束後,函式的區域性變數,會被系統回收 作用:在函式內部使用,臨時儲存函式內部需要使用的資料 全域性變數: 是在函式外部定義的變數(沒有定義某一個函式內,所有函式都

關於python的全域性變數區域性變數

全域性變數: 定義在函式外部,作用域是整個程式碼段,儲存在記憶體中。 區域性變數: 定義在函式內部,作用域僅在函式內部,儲存在棧中,當函式完成功能,區域性變數會自動丟失。 如果在函式內試圖是修改全域性變數,python會自動建立一個區域性變數替代,名字和全域性變數相同。 下面摘抄小甲魚老

Python變數學習-認識全域性變數區域性變數

學習Python的過程中少不了用到變數,在日常的編寫程式的過程中,每時每刻都在使用變數,   問:什麼是變數 答:變數是可以改變的數,通常沒有固定的值 問:有幾種變數 答:變數分為2種形式,即:全域性變數和區域性變數   名詞解釋:   全域性變數:顧名思義全域性變數,作用

keil除錯過程檢視全域性變數區域性變數的方法及編譯器優化

keil除錯過程檢視全域性變數和區域性變數的方法及編譯器優化 一、檢視全域性變數的方法:Watch Window The Watch window allows to evaluate symbols, registers, and expressions. The window

js全域性變數區域性變數以及變數宣告提升

區域性變數和全域性變數重名時: 一、Javascript的變數的scope是根據方法塊來劃分的(也就是說以function的一對大括號{ }來劃分)。切記,是function塊,而for、while、if塊並不是作用域的劃分標準。 二、 當全域性變數跟區域性變數重名時,區域性變數的scope

JS中最經典的全域性變數區域性變數問題(1、作用域作用域鏈 2、變數宣告提前)

var a = 10; function test(){ a = 100; console.log(a); console.log(this.a); var a; console.log(a); } test(); 1、程式的執行結果為:100

java全域性變數區域性變數

全域性變數是一個執行時刻實體,它在程式的整個執行過程中都存在。全域性變數生命週期為程式開始到程式結束。 全域性變數顯示初始化時,或者未初始化時,在程式映像中有不同的分割槽:已初始化的全域性變數是可執行模組的一部分。未初始化的全域性變數則不是可執行模組的一部分,只有當定義它們的程式被呼叫時

python全域性變數區域性變數

在函式內部定義的變數叫區域性變數,在函式外定義的變數叫全域性變數 如果全域性變數和區域性變數名稱相同,則在函式內部用的是區域性變數的值,就像就近原則一樣;在函式體外,用的還是全域性變數 a = 10 d