我看了extern變量,但沒有找到與其內存分配相關的答案,我的問題是誰會爲Extern變量分配內存,以及哪個內存段。其中extern變量的內存將被存儲,並通過哪個文件
int a; // file 1
extern int a; // file 2
這裏文件1將爲a或文件2分配內存。在數據段還是堆棧中?
謝謝。
我看了extern變量,但沒有找到與其內存分配相關的答案,我的問題是誰會爲Extern變量分配內存,以及哪個內存段。其中extern變量的內存將被存儲,並通過哪個文件
int a; // file 1
extern int a; // file 2
這裏文件1將爲a或文件2分配內存。在數據段還是堆棧中?
謝謝。
extern關鍵字的意思是「聲明沒有定義」。換句話說,它是一種顯式聲明變量的方法,或者在沒有定義的情況下強制聲明。
因此,在file2
中,您只是聲明瞭沒有定義的變量(沒有分配內存)。在file1
中,您聲明並定義了一個類型爲integer
的變量。在這裏您分配了內存BSS segment,因爲您有一個未初始化的全局(對於C)。
在C++中,全局變量存儲在每個進程數據區的中。聲明和定義之間
差異:
爲了理解變量是如何外部涉及到extern關鍵字,就必須知道定義和聲明一個變量之間的區別。
當定義一個變量時,編譯器爲該變量分配內存,並可能將其內容初始化爲某個值。當聲明變量時,編譯器要求將變量定義在別處。
該聲明通知編譯器該名稱和類型存在一個變量,但編譯器不需要爲它分配內存,因爲它是在別處分配的。
文件2已聲明整數類型變量a
(記得沒有定義,即目前爲止沒有爲a
分配內存)。我們可以根據需要多次執行此聲明。 檔案1 的整數類型變量已被聲明並定義。 (請記住,定義是聲明的超集)。這裏也分配了a
的內存。
Thanks @hitesh,你能告訴我哪個內存段內存將被分配?它會在數據段中,因爲它對於文件1是全局的嗎?如果我們不包括文件2中的文件1,如#include
這會在編譯時引發錯誤。因爲var是聲明的,但沒有在任何地方定義如果你想在不包含'file1.h'的情況下工作,而不是像extern int a = 0;' –
那樣讓你extern變量,那麼你好Pierre,謝謝你的理解。但是和文件1一樣,var'a'是全局的,它將內存存儲到數據段中,所以它將在數據段中或者像棧中提到的那樣?我不清楚這一點。你能解釋一下嗎? – anand
就你而言,它是在[BSS段](http://en.wikipedia.org/wiki/Data_segment)中,因爲它是一個初始化的全局變量。 –
標準C++中沒有BSS段。 –