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