C语言代码内存空间布局:堆(heap)、栈(stack)、数据段(data段)、bss段、文本段(代码段)

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段的;

猜你喜欢

转载自blog.csdn.net/weixin_42640280/article/details/127214528