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

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

3天內不再提示

C語言內存五大區(qū)詳解

玩轉單片機 ? 來源:玩轉單片機 ? 2023-11-03 09:25 ? 次閱讀

相信各位讀者應該都聽過堆棧,那么它們是一個東西呢,還是兩個東西呢,它們有啥區(qū)別呢,這就是這篇推文介紹的五大內存區(qū)。

|棧

棧(Stack):棧是一種自動分配和釋放內存的區(qū)域,用于存儲函數(shù)的局部變量、函數(shù)參數(shù)、返回值等。棧內存的分配和釋放是由編譯器自動完成的,它的大小是固定的。當函數(shù)調用結束時,棧上分配的內存會自動釋放。

#include"stdio.h"
#include"stdlib.h"

voidtest_1(unsignedchardata_1,unsignedintdata_2,unsignedchardata_3)
{
printf("data_1addr:0X%x
",&data_1);
printf("data_2addr:0X%x
",&data_2);
printf("data_3addr:0X%x
",&data_3);
unsignedchartemp_1=0;
unsignedchartemp_2=0;
unsignedchartemp_3=0;
printf("temp_1addr:0X%x
",&temp_1);
printf("temp_2addr:0X%x
",&temp_2);
printf("temp_3addr:0X%x
",&temp_3);
}

intmain()
{
test_1(10,11,12);
return0;
}

輸出:

data_1addr:0X61fe00
data_2addr:0X61fe08
data_3addr:0X61fe10
temp_1addr:0X61fdef
temp_2addr:0X61fdee
temp_3addr:0X61fded

解析:

C語言中函數(shù)參數(shù)的地址由于參數(shù)的大小可以不同,因此它們在棧中的相對位置不一定是連續(xù)的。局部變量會按變量占的空間遞減,棧區(qū)按內存地址由高到低方向生長,其最大大小由編譯時確定,速度快,但自由性差,最大空間不大。

|堆

堆(Heap):堆是一種動態(tài)分配和釋放內存的區(qū)域,用于存儲程序運行期間動態(tài)分配的內存。堆內存的分配和釋放需要手動進行,常用的函數(shù)有malloc()和free()。堆內存的大小是可變的,它的生命周期由開發(fā)人員控制。

#include"stdio.h"
#include"stdlib.h"

intmain()
{
char*j=(char*)malloc(1);
free(j);
printf("add:0X%x
",j);
return0;
}

輸出:

add:0Xad13e0

解析:

堆區(qū)由程序員分配內存和釋放。若程序員不釋放,程序結束時可能由操作系統(tǒng)回收。堆區(qū)按內存地址由低到高方向生長,其大小由系統(tǒng)內存/虛擬內存上限決定,速度較慢,但自由性大,可用空間大。

|全局區(qū)

全局區(qū)(Global Area):全局區(qū)也稱為靜態(tài)區(qū),用于存儲全局變量和靜態(tài)變量。全局區(qū)在程序啟動時分配,在程序結束時釋放。全局變量和靜態(tài)變量的生命周期與程序的運行周期相同。全局區(qū)由.bss段 和 .data段組成:


.bss段存儲未初始化的全局變量和靜態(tài)變量。在程序執(zhí)行之前,編譯器會將.bss段中的變量初始化為0或者空指針。這些變量占據(jù)的內存空間在編譯時已經確定,但在程序執(zhí)行時才真正被分配。

#include"stdio.h"
#include"stdlib.h"

intdata_1;
intdata_2;

intmain()
{
staticintdata_3;
staticintdata_4;
printf("data_1add:0X%x
",&data_1);
printf("data_2add:0X%x
",&data_2);
printf("data_3add:0X%x
",&data_3);
printf("data_4add:0X%x
",&data_4);
return0;
}

輸出:

data_1add:0X407974
data_2add:0X407970
data_3add:0X407030
data_4add:0X407034

.data段存儲已經初始化的全局變量和靜態(tài)變量。在程序執(zhí)行之前,編譯器會為.data段中的變量分配內存,并將其初始化為指定的初值。這些變量在程序運行期間一直存在,并且其內存地址是固定的。

#include"stdio.h"
#include"stdlib.h"

intdata_1=0;
intdata_2=0;

intmain()
{
staticintdata_3=0;
staticintdata_4=0;
printf("data_1add:0X%x
",&data_1);
printf("data_2add:0X%x
",&data_2);
printf("data_3add:0X%x
",&data_3);
printf("data_4add:0X%x
",&data_4);
return0;
}

輸出:

data_1add:0X407030
data_2add:0X407034
data_3add:0X407038
data_4add:0X40703c

可以理解為.bss段是存放未初始化全局變量和靜態(tài)變量的區(qū)域,而.data段是存放已初始化全局變量和靜態(tài)變量的區(qū)域。這樣的劃分可以有效地管理全局變量和靜態(tài)變量的內存使用,并且在程序執(zhí)行期間保持其值的一致性。

|常量區(qū)

常量區(qū)(Constant Area):常量區(qū)用于存儲常量數(shù)據(jù),例如字符串常量。這些數(shù)據(jù)在程序運行期間保持不變,存儲在只讀內存區(qū)域,無法修改。

#include"stdio.h"
#include"stdlib.h"

constintdata_1=100;
constintdata_2=100;

intmain()
{
staticconstintdata_3=100;
staticconstintdata_4=100;
conststaticintdata_5=100;
conststaticintdata_6=100;
printf("data_1add:0X%x
",&data_1);
printf("data_2add:0X%x
",&data_2);
printf("data_3add:0X%x
",&data_3);
printf("data_4add:0X%x
",&data_4);
printf("data_5add:0X%x
",&data_5);
printf("data_6add:0X%x
",&data_6);
return0;
}

輸出:

data_1add:0X404000
data_2add:0X404004
data_3add:0X404070
data_4add:0X404074
data_5add:0X404078
data_6add:0X40407c

|代碼區(qū)

代碼區(qū)(Code Area):代碼區(qū)存儲程序的執(zhí)行代碼,也稱為文本區(qū)。這部分內存是只讀的,存儲程序的機器指令。

9474f650-79dc-11ee-939d-92fbcf53809c.png

審核編輯:湯梓紅

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

    關注

    8

    文章

    2966

    瀏覽量

    73812
  • C語言
    +關注

    關注

    180

    文章

    7594

    瀏覽量

    135857
  • 函數(shù)
    +關注

    關注

    3

    文章

    4277

    瀏覽量

    62323
  • 堆棧
    +關注

    關注

    0

    文章

    182

    瀏覽量

    19717

原文標題:C語言|內存五大區(qū)

文章出處:【微信號:玩轉單片機,微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    一文詳解C語言內存管理

    C語言內存管理指對系統(tǒng)內存的分配、創(chuàng)建、使用這一系列操作。
    發(fā)表于 07-26 16:04 ?666次閱讀
    一文<b class='flag-5'>詳解</b><b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內存</b>管理

    C語言內存管理詳解

    C語言內存管理詳解,很不錯的一份資料.
    發(fā)表于 08-06 23:14

    C語言指針詳解

    ];//指針的類型是 int(*)[3] (5)int*(*ptr)[4];//指針的類型是int*(*)[4] 怎么樣?找出指針的類型的方法是不是很簡單? 完整的C語言指針詳解pdf格式文檔電子發(fā)燒友下載地址(共12
    發(fā)表于 07-04 03:34

    內存主要分為哪幾個區(qū)

    一、五大內存分區(qū):內存分成5個區(qū),它們分別是堆、棧、自由存儲區(qū)、全局/靜態(tài)存儲區(qū)和常量存儲區(qū)。1
    發(fā)表于 07-15 07:33

    什么是內存區(qū)

    什么是內存區(qū)?
    發(fā)表于 11-29 07:48

    單片機C語言程序與數(shù)據(jù)存儲的相關資料分享

    目錄:一、五大內存分區(qū)二、C語言程序的存儲區(qū)域三、C語言程序的段四、在C
    發(fā)表于 11-30 06:48

    內存區(qū)到底是哪區(qū)

    :大家想過沒有我們用keil寫單片機的代碼,你的函數(shù)啊、變量啊最終都放在了哪里?我們一直說的內存區(qū),到底是哪區(qū)...
    發(fā)表于 01-26 06:34

    C語言的精髓——指針詳解

    C語言的精髓——指針詳解
    發(fā)表于 11-30 14:43 ?17次下載

    C51的符號和五大語句及關鍵字等詳細資料說明

    本文檔的主要內容詳細介紹的是C51的符號和五大語句及關鍵字等詳細資料說明包括了:C語言 基本標點符號,函數(shù)書寫格式與函數(shù)調用,單片機五大語句
    發(fā)表于 12-11 17:34 ?31次下載
    <b class='flag-5'>C</b>51的符號和<b class='flag-5'>五大</b>語句及關鍵字等詳細資料說明

    單片機C語言程序與數(shù)據(jù)存儲

    目錄:一、五大內存分區(qū)二、C語言程序的存儲區(qū)域三、C語言程序的段四、在C
    發(fā)表于 11-20 20:36 ?12次下載
    單片機<b class='flag-5'>C</b><b class='flag-5'>語言</b>程序與數(shù)據(jù)存儲

    C語言程序編譯后內存地址的分配

    程序內存分配1.內存分配圖解其中C程序的內存分配為棧區(qū)、堆區(qū)、全局
    發(fā)表于 01-13 14:23 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>程序編譯后<b class='flag-5'>內存</b>地址的分配

    C語言怎么建立內存的動態(tài)分配

    C語言中,全局變量是分配在內存中的靜態(tài)存儲區(qū)的,非靜態(tài)的局部變量,包括形參是分配在內存中的動態(tài)存儲區(qū)
    的頭像 發(fā)表于 03-10 15:30 ?820次閱讀

    C語言內存問題如何解決

    大家好,我是雜燴君。 C 語言內存問題,難在于定位,定位到了就好解決了。 這篇筆記我們來聊聊踩內存。踩內存,通過字面理解即可。本來是操作這一
    的頭像 發(fā)表于 06-22 11:37 ?427次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內存</b>問題如何解決

    如何快速區(qū)分放大區(qū)和飽和區(qū)呢?

    如何快速區(qū)分放大區(qū)和飽和區(qū)呢? 標題:快速區(qū)分放大區(qū)和飽和區(qū)的方法 引言: 在電子學中,放大區(qū)和飽和區(qū)
    的頭像 發(fā)表于 11-23 09:14 ?1738次閱讀

    雙溫控和單溫控的五大區(qū)

    雙溫控和單溫控的五大區(qū)別 雙溫控和單溫控是兩種常見的溫度控制系統(tǒng),它們在溫度控制原理、應用領域、自動化程度、精度要求等方面存在顯著差異。下面將詳細介紹雙溫控和單溫控的五大區(qū)別。 一、溫度控制
    的頭像 發(fā)表于 12-19 11:04 ?4295次閱讀