使用malloc,calloc,realloc过程中常出现的错误

1.对空指针进行解引用操作

问题代码:

int main()
{
	int* p = (int*)malloc(400000000000000);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	free(p);
	p = NULL;
	return 0;
}

 运行结果:

对空指针进行解引用会造成不可预知的后果,导致程序崩溃

所以在用指针p进行操作时,我们需要先检测这个指针是否2维空指针!!!


2.对开辟出来的空间的越界访问

int main()
{
	int* p = (int*)malloc(40);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
	}
	for (i = 0; i < 20; i++)//!!!
	{
		printf("%d ", *(p + i));
	}
	free(p);
	p = NULL;
	return 0;
}

运行结果为:

因为你只开辟出了40个字节,但是这里你访问到了80个字节,属于越界访问。于是就出现了乱码。 


3.内存使用完,没有进行释放(内存泄漏)

int main()
{
	while (1)
	{
		malloc(40);
	}
	return 0;
}

不要小看这个小小代码,在电脑上不要轻易运行,

因为在死循环里,始终连续开辟一个40个字节的空间,但是没有释放。

就会导致占用的内存逐渐增多,会让电脑变卡,甚至死机。


4.释放内存时,指针没有指向原来空间的首地址(释放开辟的空间的部分内存)

代码如下:

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

运行时,程序就会报错。


5.对非动态开辟的内存进行释放

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

6.对同一块内存的多次释放

int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		return 0;
	}
	free(p);
	free(p);
	return 0;
}

为了避免以上的错误,我们要养成释放后改为空指针的习惯

int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		return 0;
	}
	free(p);
	p = NULL;
	free(p);
	return 0;
}

第一次释放之后p改为了空指针

再次对空指针释放时,不进行任何操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值