** C程序在內存中的布局大致如下圖所示 **
內存布局
從上到下依次是棧空間,堆空間,bbs段,data段,文本段
棧(stack)
1,地址空間由高向低減少,先分配高地址。
2,由編譯器自動分配釋放,主要存放函數參數,局部變量的值。
3,C語言函數參數進棧的順序是從右向左(主要是為了支持可變長參數形式)。
堆(head)
1,主要用于動態分配內存,malloc等函數,由free釋放。
靜態存儲區包括bbs段和data段
bbs(bbs)
1,存放一些未初始化的全局變量。
data(data)
1,存放一些已經初始化的全局變量,靜態變量和常量。
text(text)
1,存放程序執行代碼的區域,區域大小在運行的時候就已經確定了。
2,內存區域只讀的,也可能包含一些只讀的常數變量,字符串常量等。
一個非常清晰的程序圖
//main.c
int a = 0;//全局初始化區
char *p1;//全局未初始化區
int main()
{
static int c = 0;//全局(靜態)初始化區
int b;//棧區
char s1[] = "abc";//"abc\0"在常量區,s1棧區
char s2[] = "abc";//"abc\0"在常量區,s2棧區
//s1和s2是不想等的
char *p2;//棧區
char *p3 = "123456";//"123456\0"在常量區,p3在棧區
char *p4 = "123456";//"123456\0"在常量區,p4在棧區
//p3和p4是一樣的,都只想同一個位置"123456\0"所在位置
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得來的10和20字節的區域在堆區
return 0;
}
如有問題歡迎批評指正,謝謝!