在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在標(biāo)準(zhǔn)C語(yǔ)言中編譯出來(lái)的可執(zhí)行程序

嵌入式應(yīng)用開發(fā) ? 來(lái)源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-06-16 09:01 ? 次閱讀

在標(biāo)準(zhǔn)C語(yǔ)言中,編譯出來(lái)的可執(zhí)行程序分為代碼區(qū)(text)、數(shù)據(jù)區(qū)(data)和未初始化數(shù)據(jù)區(qū)(bss)3個(gè)部分。如下代碼

#include 
int a = 0;    //a在全局已初始化數(shù)據(jù)區(qū) 
char *p1;    //p1在BSS區(qū)(未初始化全局變量) 
void main() 
{
    int b; //b在棧區(qū)
    int c; //C為全局(靜態(tài))數(shù)據(jù),存在于已初始化數(shù)據(jù)區(qū)
    char s[] = "abc"; //s為數(shù)組變量,存儲(chǔ)在棧區(qū),
    char *p2,*p3;  //p2、p3在棧區(qū)
    p2 = (char *)malloc(10);//分配得來(lái)的10個(gè)字節(jié)的區(qū)域在堆區(qū)
    p3 = (char *)malloc(20);//分配得來(lái)的20個(gè)字節(jié)的區(qū)域在堆區(qū)
    free(p2);
    free(p3);
}

使用linux編譯之后得到的可執(zhí)行文件如下

pYYBAGKqgI-Abh5MAAFxhFyS5SM700.png

?可以看到代碼區(qū)(text)、數(shù)據(jù)區(qū)(data)和未初始化數(shù)據(jù)區(qū)(bss)。

代碼段(text):存放代碼的地方。只能訪問,不能修改,代碼段就是程序中的可執(zhí)行部分,直觀理解代碼段就是函數(shù)堆疊組成的。

數(shù)據(jù)段(data):全局變量和靜態(tài)局部變量存放的地方。也被稱為數(shù)據(jù)區(qū)、靜態(tài)數(shù)據(jù)區(qū)、靜態(tài)區(qū):數(shù)據(jù)段就是程序中的數(shù)據(jù),直觀理解就是C語(yǔ)言程序中的全局變量。注意是全局變量或靜態(tài)局部變量,局部變量不算。

未初始化數(shù)據(jù)區(qū)(bss):bss段的特點(diǎn)就是被初始化為0,bss段本質(zhì)上也是屬于數(shù)據(jù)段。

那么問題來(lái)了,為什么要區(qū)分data段和bss段呢?

以下面代碼為例,a.c和b.c的差異只是有沒有給arr數(shù)組賦值。

pYYBAGKqgKCACr-tAAJxZrCdoE4429.png

?可以看到a.out的bss段大,b.out的data段大。但是b.out的文件大小明顯比a.out的大很多。data段會(huì)增大可執(zhí)行文件的大小,而bss段不會(huì)。

data段是全局變量,但是需要初始化值,上面我的例子是全部初始全部為1,但也可能是1024*1024個(gè)不同的數(shù)據(jù),而這些數(shù)據(jù)需要保存起來(lái),表現(xiàn)出來(lái)也就是需要保存在可執(zhí)行文件中。

bss段也是全局變量,但不需要初始化值,只需要保存一下這個(gè)全部變量的保存的數(shù)據(jù)類型和大小即可。即使它的數(shù)組容量是1024*1024,也不會(huì)占用很多可執(zhí)行文件的大小。

如果一個(gè)全部變量初始化為0,那么它也是bss段,不是data段,即使你代碼中把它初始化為0了。

關(guān)于數(shù)據(jù)段,也就是data段,也會(huì)分為RO data(只讀數(shù)據(jù)段)和RW data(讀寫數(shù)據(jù)段)。

  1. 只讀數(shù)據(jù)段:程序使用的一些不會(huì)被更改的數(shù)據(jù),使用這些數(shù)據(jù)的方式類似查表式的操作,由于這些變量不需要更改,因此只需要放置在只讀存儲(chǔ)器中即可。
  2. 讀寫數(shù)據(jù)段:程序中是可以被更改的數(shù)據(jù),且初始化過(guò)的,所以需要放置在RAM中,且初始化的內(nèi)容放在存儲(chǔ)器中(表現(xiàn)為放入可執(zhí)行文件中)。

?上面說(shuō)到“編譯出來(lái)的可執(zhí)行程序分為代碼區(qū)(text)、數(shù)據(jù)區(qū)(data)和未初始化數(shù)據(jù)區(qū)(bss)3個(gè)部分”,那運(yùn)行中就會(huì)多出來(lái)一些區(qū)域,這就是我們常說(shuō)的堆棧,注意堆棧是兩個(gè)區(qū)域堆和棧。

棧:局部變量、函數(shù)一般在??臻g中。運(yùn)行時(shí)自動(dòng)分配&自動(dòng)回收:棧是自動(dòng)管理的,程序員不需要手工干預(yù)。方便簡(jiǎn)單。是提前分配好的連續(xù)的地址空間。棧的增長(zhǎng)方向是向下的,即向著內(nèi)存地址減小的方向。

堆:堆內(nèi)存管理者總量很大的操作系統(tǒng)內(nèi)存塊,各進(jìn)程可以按需申請(qǐng)使用,使用完釋放。程序手動(dòng)申請(qǐng)&釋放:手工意思是需要寫代碼去申請(qǐng)malloc和釋放free??梢允遣贿B續(xù)的地址空間。堆的增長(zhǎng)方向是向上的,即向著內(nèi)存地址增加的方向。

?下面是簡(jiǎn)單的演示代碼

#include 
#include 

int bss_var;                                //未初始化全局?jǐn)?shù)據(jù)存儲(chǔ)在BSS區(qū)
int data_var=42;                            //初始化全局?jǐn)?shù)據(jù)存儲(chǔ)在數(shù)據(jù)區(qū)

int main(int argc,char *argv[])
{
  char *p ,*b;
  printf("Adr bss_var:0x%x\n",&bss_var);
  printf("Adr data_var:0x%x\n",&data_var);
  printf("the %s is at adr:0x%x\n","main",&main);
  p=(char *)alloca(32);              //從棧中分配空間
  if(p!=NULL)
  {
    printf("the p start is at adr:0x%x\n",p);
    printf("the p end is at adr:0x%x\n",p+31);
  }
  b=(char *)malloc(32*sizeof(char));   //從堆中分配空間
  if(b!=NULL)
  {
    printf("the b start is at adr:0x%x\n",b);
    printf("the b end is at adr:0x%x\n",b+31);
  }
  free(b);         //釋放申請(qǐng)的空間,以避免內(nèi)存泄漏
  while(1);
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140625
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3825

    瀏覽量

    82516
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4891

    瀏覽量

    70321
  • 內(nèi)存分配
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    8417
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語(yǔ)言編譯過(guò)程

    C語(yǔ)言編譯鏈接過(guò)程要把我們編寫的一個(gè)C程序源代碼,轉(zhuǎn)換成可以硬件上運(yùn)行的
    發(fā)表于 06-25 10:36 ?554次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>編譯</b>過(guò)程

    C語(yǔ)言編譯鏈接過(guò)程

    ? C語(yǔ)言編譯鏈接過(guò)程要把我們編寫的一個(gè)C程序源代碼轉(zhuǎn)換成可以硬件上運(yùn)行的
    的頭像 發(fā)表于 08-21 10:06 ?3041次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>編譯</b>鏈接過(guò)程

    c語(yǔ)言比匯編編譯出來(lái)程序大多少?

    c語(yǔ)言比匯編編譯出來(lái)程序大多少?
    發(fā)表于 05-14 12:03

    labview生成的可執(zhí)行程序的反編譯

    壇子里有沒有哪位大神知道關(guān)于labview生成的可執(zhí)行程序的反編譯問題,如何反編譯exe的應(yīng)用程序?
    發(fā)表于 07-17 14:19

    從完成C源文件編輯后到執(zhí)行程序前需要哪些步驟

    一、選擇題,可多選(每題3分,共12分)1、從完成C源文件編輯后,到執(zhí)行程序前,需要進(jìn)過(guò)那些步驟( )A、編譯,運(yùn)行B、編譯,鏈接C、鏈接,
    發(fā)表于 02-28 06:18

    C語(yǔ)言編譯預(yù)處理

    將一個(gè)C程序轉(zhuǎn)換為可執(zhí)行程序的過(guò)程中, 編譯預(yù)處理是最初的步驟. 這一步驟是由預(yù)處理器(preprocessor)來(lái)完成的.
    發(fā)表于 09-20 18:17 ?47次下載

    16KEY-B的可執(zhí)行程序

    16KEY-B的可執(zhí)行程序 /*******************************************************************/ /* */ /* 單片機(jī)開發(fā)
    發(fā)表于 11-22 18:02 ?14次下載

    Setup軟件安裝可執(zhí)行程序工具免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Setup軟件安裝可執(zhí)行程序工具免費(fèi)下載。 etup.exe是電腦的可執(zhí)行進(jìn)程文件,正常情況下setup.exe表示為系統(tǒng)的安裝文件setup.exe,遇到系統(tǒng)文件
    發(fā)表于 11-13 08:00 ?11次下載

    了解Linux安裝ARM交叉編譯器的步驟

    gcc是linux環(huán)境下的asm和c語(yǔ)言編譯器,生成的是可以x86平臺(tái)上運(yùn)行的可執(zhí)行程序;
    發(fā)表于 04-26 16:12 ?6690次閱讀

    C語(yǔ)言的源代碼文件和目標(biāo)文件與可執(zhí)行文件的詳細(xì)介紹

    1、源代碼文件 存放程序代碼的文件,即我們編輯代碼的文件,稱為源代碼文件。 C語(yǔ)言程序文件的擴(kuò)展名為“.c”。源代碼文件是相對(duì)目標(biāo)文件
    的頭像 發(fā)表于 02-18 11:52 ?9167次閱讀

    嵌入式軟件開發(fā)筆試面試知識(shí)點(diǎn)總結(jié)-C語(yǔ)言部分

    功能。C語(yǔ)言中,.c文件就是所謂的源文件。??源程序可執(zhí)行程序的過(guò)程。在這個(gè)過(guò)程中,會(huì)發(fā)生如
    發(fā)表于 11-03 12:36 ?13次下載
    嵌入式軟件開發(fā)筆試面試知識(shí)點(diǎn)總結(jié)-<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>部分

    KEIL5中C語(yǔ)言編程時(shí)可以可執(zhí)行語(yǔ)句之后定義變量

    以前看過(guò)有的程序可執(zhí)行變量之后定義,當(dāng)時(shí)就挺納悶,C語(yǔ)言不是只能在函數(shù)的可執(zhí)行語(yǔ)句之前定義變量
    發(fā)表于 01-13 13:05 ?2次下載
    KEIL5中<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>編程時(shí)可以<b class='flag-5'>在</b><b class='flag-5'>可執(zhí)行</b>語(yǔ)句之后定義變量

    如何編譯嵌入式系統(tǒng)運(yùn)行的程序?

    汽車上使用的ECU中運(yùn)行的程序,是軟件工程師基于C/C++語(yǔ)言編寫出來(lái),然后通過(guò)編譯
    的頭像 發(fā)表于 02-13 14:06 ?1543次閱讀
    如何<b class='flag-5'>編譯</b>嵌入式系統(tǒng)運(yùn)行的<b class='flag-5'>程序</b>?

    c語(yǔ)言程序main函數(shù)的位置

    理解C語(yǔ)言程序執(zhí)行過(guò)程。 C語(yǔ)言程序
    的頭像 發(fā)表于 11-24 10:23 ?3404次閱讀

    ida反編譯出來(lái)代碼能直接用嗎

    一些有助于人類閱讀但不影響機(jī)器執(zhí)行的元信息,如注釋、文檔字符串以及某些編譯時(shí)優(yōu)化的細(xì)節(jié)。因此,反編譯出來(lái)的代碼可能無(wú)法完全還原原始代碼的意圖和結(jié)構(gòu)。 二、依賴性問題 即使反編譯出來(lái)的代
    的頭像 發(fā)表于 09-02 10:55 ?1343次閱讀
    主站蜘蛛池模板: 一道精品视频一区二区三区男同 | www午夜 | 簧 色 成 人| 国产看午夜精品理论片 | 丁香网五月天 | 亚洲免费mv | 屁股趴过来欠打高h | 福利视频网站 | 亚洲黄色小视频 | 国产牛仔裤系列在线观看 | 999国产精品 | 色播在线永久免费视频网站 | 亚洲成熟人网站 | 亚洲人成a在线网站 | 四虎国产精品永久免费网址 | 国内露脸夫妇交换精品 | 女的扒开尿口让男人桶爽 | 特黄色一级毛片 | 国产高清美女一级a毛片 | 34看网片午夜理 | 性欧美久久 | 色婷婷亚洲综合五月 | 性色在线视频精品 | 欧美伊人网 | 天天操夜夜噜 | 超级狂色而且免费又超好看 | 激情五月开心网 | 国产美女作爱 | 在线播放免费观看 | 欧美午夜寂寞影院安卓列表 | 五月婷综合 | 日本丰满毛茸茸熟妇 | 一级毛片免费不卡在线视频 | 91成人午夜性a一级毛片 | 久久免费视频精品 | 欧美人与性另类 | 日本特黄a级高清免费大片18 | 黄网免费观看 | 中文字幕视频二区 | 久久久午夜精品理论片 | 亚洲激情五月 |