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++ 内存分配的主要内容,如果未能解决你的问题,请参考以下文章