1. 程式人生 > >變量的存儲空間分配情況

變量的存儲空間分配情況

內存 變量 分配

C程序一直由下列部分組成:

(1)正文段——CPU執行的機器指令部分;一個程序只有一個副本;只讀,防止程序由於意外事故而修改自身指令;

(2)初始化數據段(數據段)——在程序中所有賦了初值的全局變量,存放在這裏。

(3)非初始化數據段(bss段)——在程序中沒有初始化的全局變量;內核將此段初始化為0。

(4)棧——增長方向:自頂向下增長;自動變量以及每次函數調用時所需要保存的信息(返回地址;環境信息)。

(5)堆——動態存儲分配。


一般認為在c中分為這幾個存儲區
(1)、棧 - 有編譯器自動分配釋放
(2)、堆 - 一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收
(3)、全局區(靜態區),全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜
態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。
- 程序結束釋放
(4)、另外還有一個專門放常量的地方。 - 程序結束釋放
在函數體中定義的變量通常是在棧上,用malloc, calloc, realloc等分配內存的函數分
配得到的就是在堆上。在所有函數體外定義的是全局量,加了static修飾符後不管在哪
裏都存放在全局區(靜態區),在所有函數體外定義的static變量表示在該文件中有效,
不能extern到別的文件用,在函數體內定義的static表示只在該函數體內有效。另外,
函數中的"adgfdf"這樣的字符串存放在常量區。
比如:
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc";棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區,p3在棧上。
static int c =0;全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20字節的區域就在堆區。
strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會將它與p3所指向的"12345
6"優化成一塊。
}


本文出自 “10628473” 博客,請務必保留此出處http://10638473.blog.51cto.com/10628473/1968031

變量的存儲空間分配情況