C语言:内存分配—栈区、堆区、全局区、常量区和代码区

💡 原文中文,约3300字,阅读约需8分钟。
📝

内容提要

C语言的内存分区包括栈区、堆区、全局区、常量区和代码区。栈区由编译器管理,存放局部变量;堆区由程序员管理,支持动态内存分配;全局区存放全局和静态变量;常量区存放不可修改的常量;代码区存放程序执行代码。STM32的RAM和ROM分别用于临时数据和稳定数据存储。

🔎

延伸解读

栈与堆的对比:自动与手动管理的权衡

栈区由编译器自动管理,存放局部变量和函数调用信息,按内存地址由高到低生长,遵循先进后出原则,速度快但空间有限且自由性差。堆区由程序员手动分配释放,按地址由低到高生长,空间大但速度较慢,需调用malloc和free,否则易造成内存泄漏。两者在管理方式、生长方向和性能上形成鲜明对比,适用于不同场景。

全局区的细分:.bss与.data段的区别

全局区存放全局变量和静态变量,分为.bss段和.data段。.bss段存放未初始化或初始化为0的全局/静态变量,不占用可执行文件空间,由操作系统初始化;.data段存放已初始化的全局/静态变量,占用可执行文件空间,由程序初始化。理解这两段的区别有助于优化程序的内存布局和启动效率。

STM32内存映射:RAM与ROM的职责划分

在STM32F103中,ROM从0x8000000开始,大小为0x10000,存放代码区和常量区,只读;RAM从0x20000000开始,大小为0x5000,存放全局(静态)区、堆区和栈区,可读写。RAM掉电数据消失,ROM数据稳定不变。这种划分决定了程序代码和常量存储在非易失性存储器中,而运行时变量和动态数据则使用易失性存储器。

代码验证:通过地址打印观察内存分区

文章提供的STM32代码示例通过打印各类变量的地址,直观展示了栈区、堆区、全局区、常量区和代码区的分布。例如,局部变量地址在栈区,malloc返回的指针指向堆区,全局变量和静态变量地址在全局区,字符串常量地址在常量区,main函数地址在代码区。这种方法有助于开发者验证内存布局,加深对C语言内存管理的理解。

❓

Q&A

C语言的内存分区有哪些?

C语言的内存分区包括栈区、堆区、全局区、常量区和代码区。

栈区和堆区的主要区别是什么?

栈区由编译器管理,存放局部变量,速度快但自由性差;堆区由程序员管理,支持动态内存分配,速度较慢但自由性大。

全局区存放哪些类型的变量?

全局区存放全局变量和静态变量,包括未初始化和已初始化的变量。

常量区的内容可以被修改吗?

常量区的内容在程序运行期间不可以被修改。

STM32的RAM和ROM分别用于什么?

STM32的RAM用于临时数据存储,ROM用于稳定数据存储。

如何在堆区分配内存?

可以使用malloc函数进行动态内存分配,使用free函数释放内存。

🏷️

标签

➡️

继续阅读