C/C++ 内存分配

在这里插入图片描述

C/C++程序内存分配的几个区域

1.代码区

主要存放函数体的二进制代码

2.字符常量区(只读)

	字符串存储区间
	相同的字符串存储地址相同。
#include<stdio.h>
int main(){
	char *p1 = "abc";
	char *p2= "abc";//用*p2='H',不可以被修改,p2存放的hellow world的地址,*p2相当于h,字符常量不可被修改
	printf("%p\n", p1);
	printf("%p\n", p2);
	return 0;
}

在这里插入图片描述

	解引用后不可被修改,解引用后就是字符常量。

3.数据段(静态区)

	程序结束后由系统释放。
#include<stdio.h>
int g_val1;//未初始画全局变量
int g_val2 = 1;//已初始化全局变量
static int g_val3 = 2;//静态全局变量,只限本文件使用

int main(){
	static int sta = 0;//静态局部变量,生命周期变全局
	system("pause");
	return 0;
}

4.堆区

	由程序员分配和释放,通过动态内存函数(malloc,calloc,relloc)开辟空间。
	空间是自下向上开辟的。

5.栈区

再执行函数时,栈上形成栈帧,函数内部变量的存储单元都可以再栈上开辟,函数执行结束存储单元自动释放,同时栈帧也被释放,栈是自上向下开辟空间的,
并且分配空间容量有限。栈区主要存放局部变量,函数参数,返回数据,返回地址等。
编译器通过函数里变量的大小和,首先先开辟栈帧的空间,再在栈帧中开辟变量的空间,开辟变量空间时,先按类型整体开辟空间大小,在按大小端赋上内容。
#include<stdio.h>
int g_val1;
int g_val2 = 1;

int main(){
	static int sta = 0;
	char a[5] = { 0 };
	int i = 0;
	for (; i < 5; i++){
		printf("a[%d]=%p\n", i, &a[i]);
	}
	int i = 0;
	int *p = &i;
	printf("%p\n", p);//i的最小地址
	printf("%p\n", p + 3);//i的最大地址
	return 0;
}

输出:
在这里插入图片描述

栈空间是自上向下分配的,为什么数组从0号小标开始,地址是递增的呢,因为变量开辟空间先是整体开辟,再将0号下标元素,1号下标元素依次放入。
在c语言中,任何变量(基本变量,指针变量,结构体变量,数组),空间都是整体开辟,但是任何元素的起始地址值,一定是开辟众多字节中,地址最小的。
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值