日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言 程序段 数据段,C程序段(代码段、数据段、BSS段以及堆栈)的详解

發(fā)布時(shí)間:2023/12/31 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言 程序段 数据段,C程序段(代码段、数据段、BSS段以及堆栈)的详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、C語言程序的段介紹

1.代碼段(code或text)

代碼段由各個(gè)函數(shù)產(chǎn)生,函數(shù)的每一個(gè)語句將最終經(jīng)過編繹和匯編生成二進(jìn)制機(jī)器代碼(具體生生哪種體系結(jié)構(gòu)的機(jī)器代碼由編譯器決定)。

2.只讀數(shù)據(jù)段(RO Data)

只讀數(shù)據(jù)段的特點(diǎn)是在運(yùn)行中不需要改變。只讀全局變量,只讀局部變量,程序中使用的常量等會在編譯時(shí)被放入到只讀數(shù)據(jù)區(qū)。

3.讀寫數(shù)據(jù)段(RW Data)

讀寫數(shù)據(jù)段又稱已初始化數(shù)據(jù)段,表示可以讀也可以寫的數(shù)據(jù)區(qū)。通常已初始化的全局變量和局部靜態(tài)變量被放在了讀寫數(shù)據(jù)段,如:在函數(shù)中定義static char b[ 100]={“ABCDEFG”};讀寫數(shù)據(jù)區(qū)的特點(diǎn)是必須在程序經(jīng)過初始化,如果只定義,沒初始值,則不會生成讀寫數(shù)據(jù)區(qū),而會定位為未初始化數(shù)據(jù)區(qū)(BSS)。

4. 未初始化數(shù)據(jù)段(BSS)

該段中的數(shù)據(jù)沒有經(jīng)過初始化,不是目標(biāo)文件中的一段。未初始化數(shù)據(jù)段只在運(yùn)行的初始化階段才會產(chǎn)生,因此它的大小不會影響目標(biāo)文件的大小。

5.堆(heap)

堆內(nèi)存只在程序運(yùn)行時(shí)出現(xiàn),一般由程序員分配和釋放(malloc、free)。分配內(nèi)存的函數(shù)所分配的內(nèi)存空間在堆上,程序必須保證使用free釋放,否則會發(fā)生內(nèi)存泄漏。

6.棧(stack)

棧內(nèi)存只在程序運(yùn)行時(shí)出現(xiàn),在函數(shù)內(nèi)部使用的變量、函數(shù)的參數(shù)以及返回值將使用棧空間,棧空間由編譯器自動分配和釋放。

二、舉例

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);//分配得來的10和20個(gè)字節(jié)的區(qū)域就在堆區(qū)

p2 = (char*) malloc(20);

strcpy(p1, "123456"); //123456\0 在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個(gè)地方

.

.

.

free(p1);

free(p2);

}

三、總結(jié):

1.代碼段、RO Data、RW Data及BSS這四個(gè)段都屬于程序中的靜態(tài)區(qū)域,堆和棧屬于程序的動態(tài)區(qū)域;

2.C程序經(jīng)過編譯連接生產(chǎn)的二進(jìn)制可執(zhí)行代碼,只包含代碼段、RO Data、RW Data,在程序運(yùn)行后才會包含后面兩個(gè)段,BSS中的數(shù)據(jù)將會在運(yùn)行前置0;

3.使用const定義的變量將放于程序的只讀數(shù)據(jù)區(qū);

4.函數(shù)體中定義的變量通常是在棧上,不需要在程序中進(jìn)行管理,由編繹器處理。

總結(jié)

以上是生活随笔為你收集整理的c语言 程序段 数据段,C程序段(代码段、数据段、BSS段以及堆栈)的详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。