C语言之动态内存管理

1、动态内存主要涉及的函数

void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);

2、原则

谁申请谁释放

3、内存错误案例

在这个案例中,出现了严重的地址泄漏。因为,P通过传参过去,函数里面的P已经和主函数的不是一个*P,所以导致。已经把动态创建的内存的首地址,丢失了。导致已经无法释放内存。

void func(int *p,int n)
{
	*p = malloc(n);
	if(p == NULL)
		exit(1);
	return ;
}
int main
{
	int num = 100;
	int *p = NULL;
	func(p,num);
	free(p);
	return 0;
}

解决方法一:
使用二级指针,讲主函数的p真正的传参过去

void func(int **p,int n)
{
	*p = malloc(n);
	if(*p == NULL)
		exit(1);
	return ;
}
int main
{
	int num = 100;
	int *p = NULL;
	func(&p,num);
	free(p);
	return 0;
}

解决方法二:
通过返回值,讲函数的p指针返回

int * func(int *p,int n)
{
	*p = malloc(n);
	if(*p == NULL)
		exit(1);
	return p;
}
int main
{
	int num = 100;
	int *p = NULL;
	p = func(p,num);
	free(p);
	return 0;
}

4、野指针

在函数已经把p这个指针通过free进行了释放,但是你又给p进行了赋值操作。这个时候,编译器会随机给p发配了一个地址,这个地址已经不是之前的地址了。就会造成野指针现象。

void func(int *p,int n)
{
	*p = malloc(n);
	if(p == NULL)
		exit(1);
	return ;
}
int main
{
	int num = 100;
	int *p = NULL;
	func(p,num);
	free(p);
	p = 123;//注意这一行
	return 0;
}

解决方法:
在创建或者释放指针的时候,都多加上一句指针指向NULL,可以防止出现危险的野指针

void func(int *p,int n)
{
	*p = malloc(n);
	if(p == NULL)
		exit(1);
	return ;
}
int main
{
	int num = 100;
	int *p = NULL;
	func(p,num);
	free(p);
	p = NULL;//将指针指向空
	p = 123;//注意这一行
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值