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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在標準C語言中編譯出來的可執行程序

嵌入式應用開發 ? 來源:嵌入式應用開發 ? 作者:嵌入式應用開發 ? 2022-06-16 09:01 ? 次閱讀

在標準C語言中,編譯出來的可執行程序分為代碼區(text)、數據區(data)和未初始化數據區(bss)3個部分。如下代碼

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

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

pYYBAGKqgI-Abh5MAAFxhFyS5SM700.png

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

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

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

未初始化數據區(bss):bss段的特點就是被初始化為0,bss段本質上也是屬于數據段。

那么問題來了,為什么要區分data段和bss段呢?

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

pYYBAGKqgKCACr-tAAJxZrCdoE4429.png

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

data段是全局變量,但是需要初始化值,上面我的例子是全部初始全部為1,但也可能是1024*1024個不同的數據,而這些數據需要保存起來,表現出來也就是需要保存在可執行文件中。

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

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

關于數據段,也就是data段,也會分為RO data(只讀數據段)和RW data(讀寫數據段)。

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

?上面說到“編譯出來的可執行程序分為代碼區(text)、數據區(data)和未初始化數據區(bss)3個部分”,那運行中就會多出來一些區域,這就是我們常說的堆棧,注意堆棧是兩個區域堆和棧。

棧:局部變量、函數一般在棧空間中。運行時自動分配&自動回收:棧是自動管理的,程序員不需要手工干預。方便簡單。是提前分配好的連續的地址空間。棧的增長方向是向下的,即向著內存地址減小的方向。

堆:堆內存管理者總量很大的操作系統內存塊,各進程可以按需申請使用,使用完釋放。程序手動申請&釋放:手工意思是需要寫代碼去申請malloc和釋放free。可以是不連續的地址空間。堆的增長方向是向上的,即向著內存地址增加的方向。

?下面是簡單的演示代碼

#include 
#include 

int bss_var;                                //未初始化全局數據存儲在BSS區
int data_var=42;                            //初始化全局數據存儲在數據區

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);         //釋放申請的空間,以避免內存泄漏
  while(1);
}

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7628

    瀏覽量

    139649
  • 程序
    +關注

    關注

    117

    文章

    3817

    瀏覽量

    82148
  • 代碼
    +關注

    關注

    30

    文章

    4880

    瀏覽量

    69982
  • 內存分配
    +關注

    關注

    0

    文章

    17

    瀏覽量

    8382
收藏 人收藏

    評論

    相關推薦

    C語言編譯過程

    C語言編譯鏈接過程要把我們編寫的一個C程序源代碼,轉換成可以硬件上運行的
    發表于 06-25 10:36 ?519次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>編譯</b>過程

    C語言編譯鏈接過程

    ? C語言編譯鏈接過程要把我們編寫的一個C程序源代碼轉換成可以硬件上運行的
    的頭像 發表于 08-21 10:06 ?2921次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>編譯</b>鏈接過程

    c語言比匯編編譯出來程序大多少?

    c語言比匯編編譯出來程序大多少?
    發表于 05-14 12:03

    labview生成的可執行程序的反編譯

    壇子里有沒有哪位大神知道關于labview生成的可執行程序的反編譯問題,如何反編譯exe的應用程序
    發表于 07-17 14:19

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

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

    C語言編譯預處理

    將一個C程序轉換為可執行程序的過程中, 編譯預處理是最初的步驟. 這一步驟是由預處理器(preprocessor)來完成的.
    發表于 09-20 18:17 ?47次下載

    16KEY-B的可執行程序

    16KEY-B的可執行程序 /*******************************************************************/ /* */ /* 單片機開發
    發表于 11-22 18:02 ?14次下載

    Setup軟件安裝可執行程序工具免費下載

    本文檔的主要內容詳細介紹的是Setup軟件安裝可執行程序工具免費下載。 etup.exe是電腦的可執行進程文件,正常情況下setup.exe表示為系統的安裝文件setup.exe,遇到系統文件
    發表于 11-13 08:00 ?11次下載

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

    gcc是linux環境下的asm和c語言編譯器,生成的是可以x86平臺上運行的可執行程序
    發表于 04-26 16:12 ?6637次閱讀

    C語言的源代碼文件和目標文件與可執行文件的詳細介紹

    1、源代碼文件 存放程序代碼的文件,即我們編輯代碼的文件,稱為源代碼文件。 C語言程序文件的擴展名為“.c”。源代碼文件是相對目標文件
    的頭像 發表于 02-18 11:52 ?9054次閱讀

    嵌入式軟件開發筆試面試知識點總結-C語言部分

    功能。C語言中,.c文件就是所謂的源文件。??源程序可執行程序的過程。在這個過程中,會發生如
    發表于 11-03 12:36 ?13次下載
    嵌入式軟件開發筆試面試知識點總結-<b class='flag-5'>C</b><b class='flag-5'>語言</b>部分

    KEIL5中C語言編程時可以可執行語句之后定義變量

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

    如何編譯嵌入式系統運行的程序

    汽車上使用的ECU中運行的程序,是軟件工程師基于C/C++語言編寫出來,然后通過編譯
    的頭像 發表于 02-13 14:06 ?1447次閱讀
    如何<b class='flag-5'>編譯</b>嵌入式系統運行的<b class='flag-5'>程序</b>?

    c語言程序main函數的位置

    理解C語言程序執行過程。 C語言程序
    的頭像 發表于 11-24 10:23 ?3172次閱讀

    ida反編譯出來代碼能直接用嗎

    一些有助于人類閱讀但不影響機器執行的元信息,如注釋、文檔字符串以及某些編譯時優化的細節。因此,反編譯出來的代碼可能無法完全還原原始代碼的意圖和結構。 二、依賴性問題 即使反編譯出來的代
    的頭像 發表于 09-02 10:55 ?1184次閱讀
    主站蜘蛛池模板: 中文字幕自拍 | 老师我好爽再深一点好大 | 黑森林福利视频导航 | 亚洲精品成人a在线观看 | 特级片免费看 | 人人爽影院| 日韩免费高清一级毛片在线 | 每日最新avhd101天天看新片 | 色播五月婷婷 | 欧美一卡二卡3卡4卡无卡六卡七卡科普 | 97av在线视频| 日本不卡免费高清一级视频 | 你懂的 在线观看 | 狠狠色丁香婷婷综合视频 | 日本三级成人午夜视频网 | 97人摸人人澡人人人超一碰 | 国模私拍在线视频 | 九九热视频免费在线观看 | 欧美黑人粗硬大在线看 | 黄色伊人 | 午夜小视频在线播放 | 日本欧美一区二区 | 国产精品黄网站免费进入 | 欧美日韩视频综合一区无弹窗 | 亚洲国产女人aaa毛片在线 | 99 久久99久久精品免观看 | 一级片免费在线观看 | 国产三级在线观看免费 | 乱人伦的小说 | 高清色 | 国产三级免费观看 | 夜色资源站www国产在线观看 | 日本黄视频网站 | 日本加勒比在线精品视频 | 日本大片免费一级 | 久久精品人人爽人人爽快 | 久久国产精品亚洲综合 | 亚洲已满18点击进入在线观看 | 黄色毛片子| 欧美伦理一区 | 爽a中文字幕一区 |