c语言 程序段 数据段,C程序段(代码段、数据段、BSS段以及堆栈)的详解
一、C語言程序的段介紹
1.代碼段(code或text)
代碼段由各個函數產生,函數的每一個語句將最終經過編繹和匯編生成二進制機器代碼(具體生生哪種體系結構的機器代碼由編譯器決定)。
2.只讀數據段(RO Data)
只讀數據段的特點是在運行中不需要改變。只讀全局變量,只讀局部變量,程序中使用的常量等會在編譯時被放入到只讀數據區。
3.讀寫數據段(RW Data)
讀寫數據段又稱已初始化數據段,表示可以讀也可以寫的數據區。通常已初始化的全局變量和局部靜態變量被放在了讀寫數據段,如:在函數中定義static char b[ 100]={“ABCDEFG”};讀寫數據區的特點是必須在程序經過初始化,如果只定義,沒初始值,則不會生成讀寫數據區,而會定位為未初始化數據區(BSS)。
4. 未初始化數據段(BSS)
該段中的數據沒有經過初始化,不是目標文件中的一段。未初始化數據段只在運行的初始化階段才會產生,因此它的大小不會影響目標文件的大小。
5.堆(heap)
堆內存只在程序運行時出現,一般由程序員分配和釋放(malloc、free)。分配內存的函數所分配的內存空間在堆上,程序必須保證使用free釋放,否則會發生內存泄漏。
6.棧(stack)
棧內存只在程序運行時出現,在函數內部使用的變量、函數的參數以及返回值將使用棧空間,棧空間由編譯器自動分配和釋放。
二、舉例
int a = 0; //全局初始化區,。rw data段
static int b=20; //全局初始化區,。 rw data段
char *p1; //全局未初始化區 .bss段
const int A = 10; //.rodata段
void main(void)
{
int b; //棧
char s[] = "abc"; //棧
char *p2; //棧
static int c = 0; //全局(靜態)初始化區 .rw?data段
char *p3 = "123456"; //123456\0在常量區ro data,p3 在棧上。
p1 = (char*) malloc(10);//分配得來的10和20個字節的區域就在堆區
p2 = (char*) malloc(20);
strcpy(p1, "123456"); //123456\0 在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方
.
.
.
free(p1);
free(p2);
}
三、總結:
1.代碼段、RO Data、RW Data及BSS這四個段都屬于程序中的靜態區域,堆和棧屬于程序的動態區域;
2.C程序經過編譯連接生產的二進制可執行代碼,只包含代碼段、RO Data、RW Data,在程序運行后才會包含后面兩個段,BSS中的數據將會在運行前置0;
3.使用const定義的變量將放于程序的只讀數據區;
4.函數體中定義的變量通常是在棧上,不需要在程序中進行管理,由編繹器處理。
總結
以上是生活随笔為你收集整理的c语言 程序段 数据段,C程序段(代码段、数据段、BSS段以及堆栈)的详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word2vec和node2vec笔记(
- 下一篇: iWebOffice使用VBA控制字体