百度筆試題:全局變量和局部變量在內(nèi)存中的區(qū)別

有這樣一道筆試題,包括百度、中興在內(nèi)的很多公司都曾在筆試面試中出過該題目:

請(qǐng)回答全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別?

該題目的解析如下:

答:有區(qū)別。全局變量保存在內(nèi)存的全局存儲(chǔ)區(qū)中,占用靜態(tài)的存儲(chǔ)單元;局部變量保存在棧中,只有在所在函數(shù)被調(diào)用時(shí)才動(dòng)態(tài)地為變量分配存儲(chǔ)單元。

該題目考查的知識(shí)點(diǎn)是變量的存儲(chǔ)類型及性質(zhì)。C語言經(jīng)過編譯之后將內(nèi)存分為以下幾個(gè)區(qū)域:

(1)棧(stack):由編譯器進(jìn)行管理,自動(dòng)分配和釋放,存放函數(shù)調(diào)用過程中的各種參數(shù)、局部變量、返回值以及函數(shù)返回地址。操作方式類似數(shù)據(jù)結(jié)構(gòu)中的棧。

(2)堆(heap):用于程序動(dòng)態(tài)申請(qǐng)分配和釋放空間。C語言中的malloc和free,C++中的new和delete均是在堆中進(jìn)行的。正常情況下,程序員申請(qǐng)的空間在使用結(jié)束后應(yīng)該釋放,若程序員沒有釋放空間,則程序結(jié)束時(shí)系統(tǒng)自動(dòng)回收。注意:這里的“堆”并不是數(shù)據(jù)結(jié)構(gòu)中的“堆”。

(3)全局(靜態(tài))存儲(chǔ)區(qū):分為DATA段和BSS段。DATA段(全局初始化區(qū))存放初始化的全局變量和靜態(tài)變量;BSS段(全局未初始化區(qū))存放未初始化的全局變量和靜態(tài)變量。程序運(yùn)行結(jié)束時(shí)自動(dòng)釋放。其中BBS段在程序執(zhí)行之前會(huì)被系統(tǒng)自動(dòng)清0,所以未初始化的全局變量和靜態(tài)變量在程序執(zhí)行之前已經(jīng)為0。

(4)文字常量區(qū):存放常量字符串。程序結(jié)束后由系統(tǒng)釋放。

(5)程序代碼區(qū):存放程序的二進(jìn)制代碼。

顯然,C語言中的全局變量和局部變量在內(nèi)存中是有區(qū)別的。C語言中的全局變量包括外部變量和靜態(tài)變量,均是保存在全局存儲(chǔ)區(qū)中,占用永久性的存儲(chǔ)單元;局部變量,即自動(dòng)變量,保存在棧中,只有在所在函數(shù)被調(diào)用時(shí)才由系統(tǒng)動(dòng)態(tài)在棧中分配臨時(shí)性的存儲(chǔ)單元。

有興趣的讀者可以運(yùn)行下面的程序,分析一下運(yùn)行結(jié)果。

include <stdio.h>

include <stdlib.h>

int k1 = 1;
int k2;
static int k3 = 2;
static int k4;
int main( )
{ staticint m1=2, m2;
inti=1;
charp;
charstr[10] = "hello";
char
q = "hello";
p= (char *)malloc( 100 );
free(p);
printf("棧區(qū)-變量地址 i:%p\n", &i);
printf(" p:%p\n", &p);
printf(" str:%p\n", str);
printf(" q:%p\n", &q);
printf("堆區(qū)地址-動(dòng)態(tài)申請(qǐng):%p\n", p);
printf("全局外部有初值 k1:%p\n", &k1);
printf(" 外部無初值 k2:%p\n", &k2);
printf("靜態(tài)外部有初值 k3:%p\n", &k3);
printf(" 外靜無初值 k4:%p\n", &k4);
printf(" 內(nèi)靜態(tài)有初值 m1:%p\n", &m1);
printf(" 內(nèi)靜態(tài)無初值 m2:%p\n", &m2);
printf("文字常量地址 :%p, %s\n",q, q);
printf("程序區(qū)地址 :%p\n",&main);
return0;
}
更多技術(shù)文章請(qǐng)關(guān)注微信公眾號(hào):開點(diǎn)工作室(ID:kaidiancs)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容