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

    文章

    3026

    浏览量

    74065
  • C语言
    +关注

    关注

    180

    文章

    7605

    浏览量

    136885
  • 函数
    +关注

    关注

    3

    文章

    4332

    浏览量

    62638
  • 堆栈
    +关注

    关注

    0

    文章

    182

    浏览量

    19767

原文标题:C语言|内存五大区

文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文详解C语言内存管理

    C语言内存管理指对系统内存的分配、创建、使用这一系列操作。
    发表于 07-26 16:04 709次阅读
    一文<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 855次阅读

    C语言内存问题如何解决

    大家好,我是杂烩君。 C 语言内存问题,难在于定位,定位到了就好解决了。 这篇笔记我们来聊聊踩内存。踩内存,通过字面理解即可。本来是操作这一
    的头像 发表于 06-22 11:37 461次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内存</b>问题如何解决

    如何快速区分放大区和饱和呢?

    如何快速区分放大区和饱和呢? 标题:快速区分放大区和饱和的方法 引言: 在电子学中,放大区和饱和
    的头像 发表于 11-23 09:14 1930次阅读

    双温控和单温控的五大区

    双温控和单温控的五大区别 双温控和单温控是两种常见的温度控制系统,它们在温度控制原理、应用领域、自动化程度、精度要求等方面存在显著差异。下面将详细介绍双温控和单温控的五大区别。 一、温度控制
    的头像 发表于 12-19 11:04 5582次阅读