C语言细节 内存分区模型

C++程序在运行时,会将内存划分为4个区域.其中在程序编译完成后但未运行时内存分为2个区域:
①代码区:用于存放函数体的二进制代码,由操作系统进行管理
②全局区:用于存放全局变量/静态变量/常量,由操作系统进行管理.其中又分为data区/bss区/常量区
程序开始运行后内存中会再多出2个区域:
③栈区:用于存放函数的参数值/局部变量,由编译器自动分配/释放
④堆区:由程序员分配/释放,若程序员未进行释放,程序结束时由操作系统回收
这4个区域用于存放不同的数据,被赋予了不同的生命周期,使编程时的灵活性大大提高

//实例:
#include <stdio.h>
#include <malloc.h>

int ga=1,gb=2;
static sa=1,sb=2;
const ca=1,cb=2;

int main(void) {
	printf("global:%d,%d\n",&ga,&gb);
	printf("static global:%d,%d\n",&sa,&sb);
	printf("const global:%d,%d\n",&ca,&cb);
	int la=1,lb=2;
	printf("local:%d,%d\n",&la,&lb);
	static int sla=1,slb=2;
	printf("static local:%d,%d\n",&sla,&slb);
	const int cla=1,clb=2;
	printf("const local:%d,%d\n",&cla,&clb);
	printf("str:%d,%d\n",&"aaa",&"bbb");
	int * mp=(int *)malloc(sizeof(int));
	printf("heap:%d",mp);
	return 0;
}
//结果:
global:4206608,4206612//全局区
static global:4206616,4206620//全局区
const global:4210688,4210692//常量区
local:6487572,6487568//栈区
static local:4206624,4206628//全局区
const local:6487564,6487560//栈区
str:4210807,4210803//常量区
heap:1512016//堆区

1.代码区(code area):

代码区用于存放供CPU执行的机器指令,2个特点:
①代码区是共享的,这样那些会被频繁执行的程序就只需要在内存中被存储1次
②代码区是只读的,以防程序意外修改指令

2.全局区(static area):

全局区又称静态区,用于存放全局变量/静态变量/常量.该区域的数据在程序结束后由操作系统释放.
data区和bss区分别存储已初始化和未初始化的全局变量/静态变量,常量区则用于存储常量

需要注意的是:局部const变量会被放在栈区而非全局区,全局const变量则会被放在全局区

3.栈区(stack):

栈区用于存放函数的形参/局部变量,由编译器分配并在函数结束时释放

注意:不要让函数返回局部变量的地址,因为该变量可能已被编译器销毁
#include <stdio.h>

int * f() {
	int i=123;
	return &i;
}

int main(void) {
	int * p=f();
	printf("%d\n",*p);
	printf("%d\n",*p);
	printf("%d\n",*p);
	return 0;
}
//结果:
123//编译器会保留1次返回的数据
0//第2次数据就已经被销毁
0

4.堆区(heap):

堆区是被动态分配的内存,由程序员完成分配/释放(但如果程序结束时还未被程序员释放,就会被操作系统自动释放)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值