0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

快速搞懂C语言程序内存分区!

信盈达 2025-03-14 17:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在程序运行过程中,操作系统会根据程序的需要,将内存划分为多个功能不同的区段,以便更高效地管理内存资源和确保程序的稳定运行。不同的内存区段负责存储不同类型的数据和代码,涵盖了从程序指令、全局变量到动态分配的数据等内容。

e95b4440-00b7-11f0-9434-92fbcf53809c.png

(内存分区图示)

理解这些内存分区的结构和特性,不仅有助于编写更高效的代码,还能帮助排查和解决如段错误、内存泄漏、栈溢出等常见问题。以下是常见的六个主要内存分区的详细解析:


01、栈区(Stack)
存储内容:

函数参数(如 func(int a, int b) 中的 a 和 b)。局部变量(如函数内定义的 int x = 5;)。函数调用的上下文信息(如返回地址、寄存器备份)。

特性:

自动管理:变量生命周期与作用域绑定(如函数结束时自动释放)。地址增长方向:向低地址扩展。高效但有限:分配速度快,但空间较小(默认几 MB)。

典型问题:

栈溢出(如递归过深、超大局部数组 int arr[1000000];)。悬挂指针(返回局部变量地址)。

示例代码:

voidfunc(){

intx=5; //局部变量,存储在栈区

}

02、堆区(Heap)

存储内容:动态分配的内存块(如 malloc、calloc 分配的变量)。

特性:

手动管理:需通过 free 显式释放,否则导致内存泄漏。地址增长方向:向高地址扩展,与栈区相对生长。碎片问题:频繁分配/释放可能产生内存碎片,降低效率。

典型问题:

野指针(释放后未置 NULL)。双重释放(free 同一指针多次)。

示例代码:

int*arr=(int*)malloc(100*sizeof(int));

free(arr);

arr=NULL;//避免野指针

03、BSS段(Block Started by Symbol)


存储内容:

未显式初始化的全局变量(如 int g_uninit;)。未初始化的静态变量(如 static int s_uninit;)。

特性:

隐式初始化:程序加载时由系统自动初始化为 0 或 NULL。节省空间:.bss 段不占用磁盘空间,仅在内存中分配。与 .data 区别:.data 存储非零初始值,而 .bss 存储默认零值。

示例代码:

intg_uninit;//存储在BSS段,自动初始化为0

staticints_uninit;//存储在BSS段,自动初始化为0

04、数据段(Data Segment)


存储内容:

已显式初始化的全局变量(如 int g_var = 10;)。

已初始化的静态变量(如函数内的 static int s_var = 20;)。

特性:

显式初始化:必须赋初值(非零值)。

生命周期:从程序启动到结束(与全局变量一致)。

示例:extern 声明的全局变量实际指向此区。

示例代码:

intg_var=10; //存储在数据段

staticints_var=20;//存储在数据段

05、常量区(Read-Only Data Segment)

存储内容:

字符串常量(如 "Hello, World")。const 修饰的全局常量(如 const int MAX = 100;)。浮点数常量、整型常量表等只读数据。

特性:

运行时不可修改:试图修改会导致段错误(Segmentation Fault)。跨文件共享:同一常量在多个源文件中引用时,仅存储一份。注意:const 修饰的局部变量不在此区,而是存储在栈区。

示例代码:

constintMAX=100;//存储在常量区

char*msg="Hello";//存储在常量区

06、代码段(Text Segment)

存储内容:编译后的二进制机器指令(即程序的执行代码)。

特性:

只读:禁止修改,防止程序意外篡改指令。可共享:多个进程可同时加载同一份代码(如动态库)。示例:函数定义(如 void func() { ... })、控制逻辑(如 if/for 语句的底层实现)。

示例代码:

voidfunc(){//函数定义存储在代码段

printf("Hello");

}

总结

区域存储内容生命周期常见问题
栈区局部变量、参数、返回地址函数调用期间栈溢出、悬挂指针
堆区动态分配的内存块malloc 分配到 free 释放内存泄漏、野指针、双重释放
BSS段未初始化的全局和静态变量程序运行期间
数据段已初始化的全局和静态变量程序运行期间
常量区字符串常量、const 常量程序运行期间段错误
代码段机器指令程序运行期间段错误

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    9

    文章

    3173

    浏览量

    76099
  • 操作系统
    +关注

    关注

    37

    文章

    7328

    浏览量

    128605
  • C语言程序
    +关注

    关注

    1

    文章

    20

    浏览量

    10571
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言使用函数调用的知识点

    C语言使用函数调用,我们再熟悉不过了,但是函数调用在内存中究竟发生了什么真的清楚吗?只有搞清楚内存里的内幕,才算完全搞懂函数的调用。
    发表于 09-07 11:47 1180次阅读

    一文详解C语言内存管理

    C语言内存管理指对系统内存的分配、创建、使用这一系列操作。
    发表于 07-26 16:04 981次阅读
    一文详解<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内存</b>管理

    C语言程序设计中动态内存分配如何实现

    C语言程序设计中,动态内存分配如何实现,需要注意哪些问题?
    发表于 09-28 16:53 2055次阅读

    C语言编程程序内存如何布局

    重点关注以下内容:  C语言程序内存中各个段的组成  C语言
    发表于 09-13 15:04

    单片机C语言程序与数据存储的相关资料分享

    目录:一、五大内存分区二、C语言程序的存储区域三、C语言
    发表于 11-30 06:48

    时钟设计程序C语言

    时钟设计程序。时钟设计程序。时钟设计程序C语言】时钟设计程序
    发表于 12-28 12:02 0次下载

    程序设计之内存管理

    使用C语言编程时,关于程序设计之内存管理。
    发表于 05-20 17:01 0次下载

    存储器的分区内存管理与分区存储管理

    内存固定地划分为若干个大小不等的分区供各个程序使用,每个分区的大小和位置都固定,系统运行期间不再重新划分。
    发表于 05-26 10:28 3506次阅读
    存储器的<b class='flag-5'>分区内存</b>管理与<b class='flag-5'>分区</b>存储管理

    使用单片机实现62256扩展内存C语言程序免费下载

    本文档的主要内容详细介绍的是使用单片机实现62256扩展内存C语言程序免费下载。
    发表于 03-16 14:39 12次下载

    单片机C语言程序与数据存储

    目录:一、五大内存分区二、C语言程序的存储区域三、C语言
    发表于 11-20 20:36 12次下载
    单片机<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>程序</b>与数据存储

    C语言程序编译后内存地址的分配

    本文目的是简要介绍C语言编译得到的可执行文件加载到内存运行时不同变量分配的存储位置,并通过在Ubuntu 18.04系统和STM32系统上进行编程验证C
    发表于 01-13 14:23 1次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>程序</b>编译后<b class='flag-5'>内存</b>地址的分配

    C语言使用函数调用在内存中究竟发生了什么?

    C语言使用函数调用,我们再熟悉不过了,但是函数调用在内存中究竟发生了什么真的清楚吗?只有搞清楚内存里的内幕,才算完全搞懂函数的调用。
    的头像 发表于 01-13 14:09 1929次阅读

    详解C语言程序内存分区

    每一个C语言程序,都将最终经过这一处理而得到相应的目标文件。
    的头像 发表于 06-11 17:29 2020次阅读
    详解<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>程序</b><b class='flag-5'>内存</b><b class='flag-5'>分区</b>

    C语言内存问题如何解决

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

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈内存会自动分配和释放。C
    发表于 03-19 11:38 1063次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内存</b>泄漏问题原理