C\C++各种变量存放区域(代码、数据、堆、栈)
文章目录
变量&数据
int val=0;//val:数据,存放在数据区。在执行exe文件时直接加载,并不会产生机器指令:mov [val],0
//编译器编译的过程中,直接把全局量放在exe文件中,当exe文件被调用时就加载全局变量。
//全局对象,全局对象的构造函数先于主函数运行(?)
//全局变量与全局对象的区别?————《程序员的自我修养》
int g_max;//bss区(未初始化区)
int fun()
{
int x=10;//在函数调用时,会产生相关机器指令,所以称x为变量
//mov[x],0ah;
return 0;
}
变量&数据存放区域
一般情况下,一个可执行C程序在内存中主要包含5个区域,分别是代码段(text),数据段(data),BSS段,堆段(heap)和栈段(stack)。其中包含data段和bss段的整个区段被合称为数据区。
其中前三个段(text,data,bss)是程序编译完成就存在的,此时程序并未载入内存进行执行。后两个段(heap,stack)是程序被加载到内存中时,才存在的。
C++程序在执行时,将内存大方向划分为4个区域:
-
代码区(text):存放函数体的二进制代码(C程序编译后的机器指令,汇编代码),由操作系统进行管理。代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令。
-
数据区(data):存放全局变量和静态变量以及常量。
-
数据区(bbs):存储未初始化的全局变量或者静态(全局)变量。编译器给处理成0。
-
栈区:静态内存分配,存放函数调用相关的参数、局部变量的值,以及在任务切换的上下文信息。栈区是由操作系统分配和管理的区域。
在Windows操作系统中,栈区的大小默认为1MB,但可以通过编译器或操作系统的设置来改变。在Linux系统中,栈区的大小默认大小为8MB,但可以通过ulimit命令来修改。
-
堆区:动态内存分配,由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。(malloc&free,new&delete)
内存四区意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。

变量存放区域:
生命周期 | 作用域 | 默认值 | 内存区域 | 链接属性 | |
---|---|---|---|---|---|
静态全局变量 | 程序运行时创建,程序退出时销毁 | 整个文件 | 0 | 全局(静态)变量区 | 内部的 |
普通全局变量 | 程序运行时创建,程序退出时销毁 | 整个文件 | 0 | 全局(静态)变量区 | 外部的 |
静态局部变量 | 进入函数时创建,程序退出时销毁 | 函数内部 | 0 | 全局(静态)变量区 | 无 |
普通局部变量 | 进入函数时创建,函数退出时销毁 | 函数内部 | 随机值 | 栈 | 无 |
动态内存 | 调用创建函数创建,调用释放函数销毁 | 只要能获取指针都能用 | 随机值 | 堆 | 无 |
静态函数 | 无 | 整个文件 | 无 | 代码区 | 内部的 |
普通函数 | 无 | 整个文件 | 无 | 代码区 | 外部的 |
练习:请说明下面的指针分别指向什么位置
void foo(char a)
{
static char nCount;
char p1[] = “AAA”;
char *p2 = “AAA”;
char *p3 = (char *)malloc(10);
char *p4 = &a;
char *p5 = &nCount;
}
void (*p)