C\C++各种变量存放区域(代码、数据、堆、栈)

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)

内存四区意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。

img

变量存放区域:

生命周期 作用域 默认值 内存区域 链接属性
静态全局变量 程序运行时创建,程序退出时销毁 整个文件 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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值