1、程序的内存分配
======================
参考:
https://blog.csdn.net/weixin_44564958/article/details/122873470
======================
由低地址到高地址,在内存中依次分成:文本段(text)、数据段(.data)、bss段、堆(heap)、栈(stack)
- 文本段(text):(也有叫 代码段)
主要保存进程的二进制程序代码,也保存可读的常量和变量,例如字符串常量 - 数据段(.data)
保存的是已经初始化不为0的全局变量和静态变量 - bss段
未初始化的全局变量(全局变量不初始化默认为0)或者是初始化为0的全局变量;
注:bss段中表示的是占位符,不给该段的数据分配空间,只记录所需要的空间大小; - 堆(heap)
用来动态分配的内存,使用malloc等函数分配,free,delete等函数释放,要是没有用手动释放内存,在程序结束后由操作系统释放;
注:是一种由内存低地址向高地址扩展的数据结构; - 栈(stack)
存放动态局部变量(注意全局变量和static静态变量都存储在静态区)、函数的参数和返回值也是存储在这里;
注:是内存地址由高地址到低地址扩展的数据结构;
=======
- 全局/静态存储区:
如图中所示,全局/静态存储区包含了数据段(data)和bss段两个部分;
- 常量存储区:
放置在编译期间就可以确定存储大小的常量,这个常量不允许被修改;
- 注意:
- 存放RAM中:数据段(.data)、bss段、堆(heap)、栈(stack);
- 存放ROM中:文本段(text)、常量存储;
2、示例
如下一段代码看变量和常量都是放在内存的哪些区域中:
//main.c源文件
int a = 0; //全局初始化为0 全局/静态存储区中bss段
char *p1; //全局未初始化区 全局/静态存储区宗data段
int main()
{
int b; //局部变量 栈
char s[] = "abc"; //局部变量 栈
char *p2; //局部变量 栈
char *p3 = "123456"; //p3在栈上;123456\0 这个值是常量,放在常量存储区(代码段text);
static int c = 0; //静态变量初始化为0 全局/静态储存区中bss段
p1 = (char *)malloc(10);//malloc分配保存在 堆
p2 = (char *)malloc(20);//malloc分配保存在 堆
strcp(p1, "123456"); //123456\0 这个值放在常量存储区(代码段中)
return 0;
}
3、关于全局变量和静态变量初始化为0是放在bss段还是放在data段的问题
关于全局/静态存储区中的data段和bss段存储一个问题:
在很多博客都是说
data段放置已经初始化的全局变量和静态变量
bss段放置未初始化的全局变量和静态变量
但是在朱有鹏老师笔记上是:
data段放置已经初始化不为0的全局变量和静态变量(加了个初始化不为0)
bss段放置未初始化或者初始化为0的全局变量和静态变量(不初始化和初始化为0都放在bss段)
如下:int a; //不初始化的全局变量 (放在bss段)
int a = 0;//初始化为0的全局变量
int a = 1; //初始化不为0的全局变量(放在data段)
总结:
1、从上面实际获取size看,全局变量和静态变量在初始化为0的时候,是放置在bss段的;