动态内存管理总结

动态内存管理
**
1.在函数内部定义变量,我们称之为局部变量,空间开辟在栈区,称之为静态开辟
2.系统内存:栈区(局部变量,函数的参数,临时变量,空间的回收是自动的),堆区(malloc,动态开辟,手动回收),静态常量区(static,char ar[]=“sdfgh”;char* str=“sd”😉
**
1.动态开辟函数:
int* pa;//他没有指向合法的空间,它内部没有存放一个有效地址,但它本身会开辟空间
2.头文件

#include<malloc.h>

3.malloc()函数

void* malloc(size_t size);
int* pa=malloc(sizeof(int)*10);//大小必须自己计算,在堆区申请;在返回时必须进行检测;返回值必须强转

在申请完成后,判断返回值
if(pa==NULL){
//空间申请失败
}
或者使用断言
assert(pa!=NULL);
在释放指针之后为了杜绝野指针,在free(ptr);后面对指针进行赋空值,ptr=NULL;
4.free()函数
用来释放动态内存
杜绝越界访问,越界访问会造成不可以正常释放
释放之后的指针,称之为野指针
5.头文件

#include<vld.h>//检测动态内存泄露

内存泄漏:指申请了空间,现在没有办法进行释放
6.calloc()函数

void* calloc(size_t num,size_t size);

不同:可以自己计算大小;他赋值时会用0初始化

#include<memeory.h>
memset(pa,0,sizeof(int)*10);//进行初始化

7.realloc()函数

void* realloc(void* memblock,size_t size);
pa=(int*)realloc(pa,sizeof(int*10);//对原有空间重新申请,将之前空间的内容

拷贝过来,在释放之前的空间
作用:对动态内存大小的调整
**
自己实现函数:

1.realloc(ovid8 memblock,size_t size); --缺少如何判断是否可以在其后面进行申请
void my_realloc( void* memblock,size_t size){
	//既可以把空间调大,也可以将空间调小
	vod* new_base=malloc(size);//申请新空间
	memcpy(new_base,memblock,size);//将原来的没数据进行拷贝
	free(memblock);//将原来的空间进行释放
	return new_base;//返回现在的数据
}

**
1.常见错误
2.vld.h
.dll 动态链接库
.lib 静态链接库
**
1.柔性数组
柔性 数组 成员

typedef struct test{//属于结果提里面的成员,他是一个是数组,
	int len;
	int c[0];//他不占空间,它只能放在最后面
}
int main(){
	text* pt=(text*)malloc(sizeof(pt)+len+1);//申请空空间
	`
	`
	`
	free(pt);
}

**
并非所有动态开辟空间都可以用free()进行释放,并非所用动态申请的空间都在堆区,也有可能在栈区

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值