C/C++ 内存分配

Posted 两片空白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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语言中,任何变量(基本变量,指针变量,结构体变量,数组),空间都是整体开辟,但是任何元素的起始地址值,一定是开辟众多字节中,地址最小的。

以上是关于C/C++ 内存分配的主要内容,如果未能解决你的问题,请参考以下文章

C++C/C++内存分配机制(非原创)

C++/C 语言独立内存分配

在 C/C++ 中实现实时最佳拟合内存分配算法

系统C/C++内存管理之内存分配

C/C++程序内存的分配

C/C++变量分配区域