动态内存开辟的常见错误

目录

前言

一、对空指针的解引用操作

二、对动态开辟空间的越界访问

三、对非动态开辟内存使用free释放 

四、使用free释放一块动态开辟内存的一部分

五、对同一块动态内存多次释放 

六、动态开辟内存忘记释放(内存泄漏) 

总结


前言

这篇博客讲一下我们进行动态内存开辟会搞出的一些问题!

一、对空指针的解引用操作

我们看一个代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(20);
	*p = 5;
	return 0;
}

这个代码乍一看会觉得没有问题啊,可是我们想一下,如果没能找到一块空间给予p,那就会给到一个空指针,而我们下面对这个空指针进行解引用操作后就会有问题。 

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(20);
	if (p == NULL)
	{
        	
	}
	else
	{
		*p = 5;
	}

	return 0;
}

如上代码改一下就可以解决这个问题了。 

二、对动态开辟空间的越界访问

int main()
{
	int*p = (int*)malloc(20);
	if (p == NULL)
		return 1;
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		*(p + i) = i;
	}
	for (i = 0; i < 20; i++)
	{
		printf("%d ", p[i]);
	}
	free(p);
	p = NULL;

	return 0;
}

上面这个代码就是一个越界访问。你运行就会出现警告。

三、对非动态开辟内存使用free释放 

 

int main()
{
  int num = 10;
  int*p = &num;
  free(p);
  p = NULL;
  return 0;
}

上面这个代码,num并不是我们动态开辟的内存,但是我们用了free去释放它,这样就会出现问题,编译器也会“不知所措”的。 

四、使用free释放一块动态开辟内存的一部分

int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
		return 1;
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		*p = i;
		p++;
	}
	free(p);
	p = NULL;

	return 0;
}

这个代码里我们可以看到有一个p++,这个操作直接就给我们把开辟的空间的指针改变了指向位置,当我们在后面free这个p时就会出问题,我们的程序就会直接崩掉!

五、对同一块动态内存多次释放 

int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
		return 1;
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		*(p + i) = i;
	}
	
	free(p);

	free(p);

	return 0;
}

上面代码就对p进行了多次释放,这样干的话,我们的代码在编译器上跑的时候就会崩!

六、动态开辟内存忘记释放(内存泄漏) 

int* get_memory()
{
	int* p = (int*)malloc(40);
	
	return p;
}


int main()
{
	int *ptr = get_memory();

	return 0;
}

上面的代码就是一个内存泄漏,我们只顾着申请了,而没有去对它释放,那我们申请的内存一旦越来越多,电脑就会变慢啊,变卡啊,所以这是很糟糕的! 

总结

好了,以上就是我要介绍的所有动态开辟内存会产生的问题,欢迎指正!

感谢支持!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值