By SmartPtr(http://www.shnenglu.com/SmartPtr/) 今天收到學(xué)弟的一封信,問(wèn)我關(guān)于變量與內(nèi)存的一些問(wèn)題,其實(shí)這是一個(gè)很基本的概念,但可能還有很多人對(duì)這個(gè)還不太了解(包括自己可能也會(huì)有誤解的地方),遂將原信與回信放于此:
原信
問(wèn)幾個(gè)我比較混亂的問(wèn)題。
看一下我寫的對(duì)不對(duì)
int g_variable; //占編譯后的代碼空間,運(yùn)行時(shí)占內(nèi)存(常住內(nèi)存)
const int c_value = 5; //占編譯后的代碼空間, 是不是常住內(nèi)存呢?
void fun(void)
{
static int s_variable; //占編譯后的代碼空間,運(yùn)行時(shí)占內(nèi)存(常住內(nèi)存)
int variable; //fun 被調(diào)用時(shí)放入棧中(占用內(nèi)存)
}
如果我定義一下大一點(diǎn)的數(shù)組,如:
const int c_array[100] = ...;
程序一運(yùn)行時(shí)就會(huì)被分配 400 Byte 的內(nèi)存空間嗎?還是在我使用它時(shí)會(huì)被分配400 Byte 的內(nèi)存空間嗎?
回信
先給你大概講一下基本概念, 問(wèn)題在原信下用
紅色回答
一個(gè)程序的運(yùn)行起來(lái)后,其在內(nèi)存中有5個(gè)區(qū)域
1. 程序代碼區(qū)這個(gè)很簡(jiǎn)單,存放執(zhí)行指令,代碼要執(zhí)行,肯定要加載進(jìn)內(nèi)存, 我們不必關(guān)心。
2. 文字常量區(qū)一般我們這樣定義一個(gè)字符串時(shí),其是在文字常量區(qū)的:
char* s1 = "hello, world";
char* s2 = "hello, world";
if(s1 == s2)
printf("s1和s2指向同一個(gè)在文字常量區(qū)的字符串");
這里, s1和s2指向的是同一個(gè)字符串
3. 靜態(tài)存儲(chǔ)區(qū)全局變量,靜態(tài)變量會(huì)放在這個(gè)區(qū)域,事實(shí)上,全局變量也是靜態(tài)的。
以上1,2,3三個(gè)區(qū)域的內(nèi)存在程序起來(lái)的時(shí)候就開辟好了的。
4. 棧局部變量就是在棧里的。另外,函數(shù)調(diào)用時(shí)的參數(shù)也是在棧里的,這個(gè)現(xiàn)在不必關(guān)心
5. 堆malloc或new出來(lái)的內(nèi)存就是在堆里的,需要程序員自己管理清除。
**********原信***************************************************
問(wèn)幾個(gè)我比較混亂的問(wèn)題。
看一下我寫的對(duì)不對(duì)
int g_variable; //占編譯后的代碼空間,運(yùn)行時(shí)占內(nèi)存(常住內(nèi)存)
[Huang]屬于3,程序一運(yùn)行就占內(nèi)存,知道程序退出才釋放 const int c_value = 5; //占編譯后的代碼空間, 是不是常住內(nèi)存呢?
[Huang]其實(shí)這個(gè)與是否const無(wú)關(guān),如果這句是全局的,那么同上,如果是局部的,那么屬于4 void fun(void)
{
static int s_variable; //占編譯后的代碼空間,運(yùn)行時(shí)占內(nèi)存(常住內(nèi)存)
int variable; //fun 被調(diào)用時(shí)放入棧中(占用內(nèi)存)
}
[Huang]第一句屬于3, 第二句屬于4 如果我定義一下大一點(diǎn)的數(shù)組,如:
const int c_array[100] = ...;
程序一運(yùn)行時(shí)就會(huì)被分配 400 Byte 的內(nèi)存空間嗎?還是在我使用它時(shí)會(huì)被分配400 Byte 的內(nèi)存空間嗎?
[Huang]還是那句話,是全局的,那么 程序一運(yùn)行時(shí)就會(huì)被分配 400 Byte 的內(nèi)存空間, 如果是局部的,那么在我使用它時(shí)會(huì)才會(huì)被分配400 Byte 的內(nèi)存空間 你這里多次提到const, 其實(shí)const與這個(gè)主題并沒(méi)有關(guān)系。的確,const與static聲明的全局變量具有內(nèi)部鏈接的特性,但是即使在每個(gè)obj里都有一個(gè)此變量的拷貝,也不影響其內(nèi)存在靜態(tài)區(qū)的分配。
posted on 2007-09-13 00:01
SmartPtr 閱讀(1137)
評(píng)論(5) 編輯 收藏 引用