C/C++内存分配问题

孤街醉人 提交于 2020-01-30 11:08:04

一个C/C++程序经过编译后,占用的内存主要分为以下5个部分 (地址由高到低)

1、栈区(stack) — 运行时分配
2、堆区(heap)— 运行时分配

3、全局区(静态区static) — 保存在 ELF 可重定位目标文件中
(1)已初始化的全局(静态)变量:.data段
(2)未初始化的全局(静态)变量:.bss段

4、文字常量区 — 保存在 ELF 可重定位目标文件中的 .rodata
5、程序代码区 — 保存在 ELF 可重定位目标文件中的 .text

栈区:由编译器自动分配和释放。
栈区存放的内容:
(1)函数的返回地址和函数的参数。
(2)函数在调用前后需要保持、不变的寄存器。
(3)函数的非静态(static)局部变量以及编译器自动生成的其他临时变量。
在C/C++程序中:主函数,中断服务函数,以及多任务系统(RTOS)中的任务函数 ,或者linux系统中的进程,它们的执行都需要各自运行栈的支持。

堆区:由程序员调用 malloc 函数主动申请,需要释放时调用 free 函数释放。
若申请了堆区的内存之后忘记释放,很容易造成内存泄漏。频繁地申请和释放堆区内存会产生堆区碎片。

全局区(静态区static):存放程序的数据(程序 = 指令 + 数据)。
文字常量区:存放程序的数据(程序 = 指令 + 数据)。
程序代码区:存放程序的指令(程序 = 指令 + 数据)。

-------------------------------------------------------分割线------------------------------------------------------------

举例分析

int a = 6;
main()
{
static int b = 7
char * str = “hello”;
char str[ ] = “world”;
const int c = 8;
retrun 0;
}
------在语句 int a = 6;中,初始值 6 存放在 .data 段。

------在语句 static int b = 7;中,初始值 7 存放在 .data 段。

------在语句 char * str = “hello”;中, “hello” 存放在 .rodata 段,指针变量 str 存放在栈区

------在语句 char str[ ] = “world”;中,"world"是通过立即数的形式作为指令的一部分,存放在 .text 段,字符数组 str[ ] 存放在栈区

------在语句 const int c = 8;中,初始值 8 是通过立即数的形式作为指令的一部分,存放在 .text 段,局部变量 c 存放在栈区

------特别注意:const修饰的变量并不在 .rodata 段,它只是将修饰的变量设置为只读。该变量原来在什么位置,经过const修饰之后仍然在原来的位置。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!