C語(yǔ)言中一些關(guān)于內(nèi)存四區(qū)的歸納
博文參考傳送門
一、綜述
C語(yǔ)言程序中套耕,代碼是放在內(nèi)存中執(zhí)行的,我們大致將程序所占用的內(nèi)存分為四個(gè)區(qū)域:
-
棧區(qū) 堆區(qū) 數(shù)據(jù)區(qū) 代碼區(qū)
每個(gè)程序都有唯一一個(gè)內(nèi)存四區(qū)峡继,我們應(yīng)該掌握各個(gè)區(qū)域的特性冯袍,例如存儲(chǔ)哪種類型的數(shù)據(jù),由誰(shuí)去申請(qǐng)開(kāi)辟碾牌,又由誰(shuí)去管理釋放等等康愤。
二、內(nèi)存四區(qū)介紹
1. 棧區(qū)
由編譯器自動(dòng)分配釋放舶吗,比如存放函數(shù)的參數(shù)值征冷,局部變量等。
例如:
void recive(int a,int b) {
int c;
}
其中誓琼,參數(shù)a检激,參數(shù)b和變量c都是存放在棧區(qū),當(dāng)函數(shù)執(zhí)行完畢的時(shí)候腹侣,它們占有的空間自動(dòng)釋放叔收。
2. 堆區(qū)
一般由程序員分配釋放(如動(dòng)態(tài)內(nèi)存申請(qǐng)<malloc函數(shù)>),若程序員不釋放傲隶,程序結(jié)束時(shí)可能由操作系統(tǒng)回收饺律。
例如:
char *src;
src = (char*)malloc(4 *sizeof(char));//動(dòng)態(tài)分配內(nèi)存,表示查找可用的連續(xù)4個(gè)字節(jié)內(nèi)存的空間跺株,并將該內(nèi)存首地址強(qiáng)制轉(zhuǎn)換為指向字符數(shù)據(jù)的指針賦給scr复濒,為src這個(gè)指針變量分配4個(gè)char類型的空間。
3.數(shù)據(jù)區(qū)
分為兩種:1乒省、常量區(qū):存放常量巧颈,一般是字符串常量。
2袖扛、全局區(qū)(靜態(tài)區(qū)):存放全局變量和靜態(tài)變量砸泛。
該區(qū)域是在程序結(jié)束后由操作系統(tǒng)釋放。
4.程序代碼區(qū)
這個(gè)區(qū)域存放函數(shù)體的二進(jìn)制代碼,也是由操作系統(tǒng)進(jìn)行管理晾嘶。
三妓雾、劃分內(nèi)存四區(qū)的意義
C語(yǔ)言程序中,根據(jù)是局部變量垒迂,全局變量械姻,常量還是其他,通過(guò)malloc等類似的函數(shù)分配內(nèi)存空間机断,把他們放到對(duì)應(yīng)的內(nèi)存區(qū)中楷拳,這樣就賦予了這些變量或常量不同的生命周期。
根據(jù)我們程序的需要吏奸,我們?cè)诰帉?xiě)代碼過(guò)程中欢揖,聲明不同的變量類型,使他們有不同的聲明長(zhǎng)度奋蔚,不同的釋放方式她混,可以讓我們更加靈活地編程。
四泊碑、內(nèi)存四區(qū)的一個(gè)實(shí)例
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
char* p1[3]= {"abc","def","ghi"};
char p2[3][4]= {"123","456","789"};
char** p3= (char**)malloc( 3 * sizeof(char*));
for(i=0;i < 3;i++)
{
p3[i]= (char *)malloc ( 5 * sizeof(char));
sprintf(p3[i],"%d%d%d",i,i,i);
/*
sprintf()函數(shù):最常見(jiàn)的應(yīng)用之一是把整數(shù)打印到字符串中
例如:
srpintf(s,"%d",123);
輸出為:"123"
輸出結(jié)果不會(huì)打印在屏幕上坤按,而是寫(xiě)入字符串中
*/
printf("%s\n",p3[i]);
/*
printf()函數(shù)才將結(jié)果輸出到屏幕上
*/
}
free(p3);
return 0;
}
示例代碼圖示:
示例代碼圖示