精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

C語言內存五大區詳解

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

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

|棧

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

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

|堆

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

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

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

輸出:

add:0Xad13e0

解析:

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

|全局區

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


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

#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段存儲已經初始化的全局變量和靜態變量。在程序執行之前,編譯器會為.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段是存放未初始化全局變量和靜態變量的區域,而.data段是存放已初始化全局變量和靜態變量的區域。這樣的劃分可以有效地管理全局變量和靜態變量的內存使用,并且在程序執行期間保持其值的一致性。

|常量區

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

#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

|代碼區

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

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

審核編輯:湯梓紅

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

    關注

    8

    文章

    2998

    瀏覽量

    73881
  • C語言
    +關注

    關注

    180

    文章

    7598

    瀏覽量

    136172
  • 函數
    +關注

    關注

    3

    文章

    4304

    瀏覽量

    62427
  • 堆棧
    +關注

    關注

    0

    文章

    182

    瀏覽量

    19731

原文標題:C語言|內存五大區

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

收藏 人收藏

    評論

    相關推薦

    一文詳解C語言內存管理

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

    C語言內存管理詳解

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

    C語言指針詳解

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

    內存主要分為哪幾個

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

    什么是內存

    什么是內存
    發表于 11-29 07:48

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

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

    內存到底是哪

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

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

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

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

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

    單片機C語言程序與數據存儲

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

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

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

    C語言怎么建立內存的動態分配

    C語言中,全局變量是分配在內存中的靜態存儲的,非靜態的局部變量,包括形參是分配在內存中的動態存儲
    的頭像 發表于 03-10 15:30 ?829次閱讀

    C語言內存問題如何解決

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

    如何快速區分放大區和飽和呢?

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

    雙溫控和單溫控的五大區

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