给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行!!! 铁铁们,成功的路上必然是孤独且艰难的,但是我们不可以放弃,远山就在前方,但我们能力仍然不足,所有我们更要奋进前行!!! 今天我们更新了xxxxxxx内容
在我们使用malloc或者calloc这些函数进行动态内存开辟的时候,总会存在一些我们可能考虑不到的错误,今天我们就一起来看一下这些错误,让我们在以后的写代码时避免这些错误。
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
void test()
{
int i = 0;
int* p = (int*)malloc(10 * sizeof(int));
if (NULL == p)
{
exit(EXIT_FAILURE);
}
for (int i = 0; i <= 10; i++)
{
*(p + i) = i;
}
free(p);
}
int main()
{
test();
return 0;
}
大家看这串代码,起初一看感觉没有任何问题,但是仔细一看就会发现,我们一共开辟的10个空间,但是循环时为十一个空间赋值,此时就会造成数组越界访问。
运行时便会出现这种错误。
int main()
{
int a = 10;
int* p = &a;
free(p);
p = NULL;
return 0;
}
大家再来看这串代码,我们可以看到最后我们使用了free进行内存释放,但是我们想一下,我们都没有使用动态内存函数开辟空间,又为啥要去释放呢,所以这就是这题的错误之处。
运行时便会产生这种错误。
int main()
{
int* p = (int*)malloc(100);
if (p == NULL)
{
return 1;
}
for (int i = 0; i < 5; i++)
{
*p = i + 1;
p++;
}
free(p);
p = NULL;
return 0;
}
大家再来看一下这串代码,我们可以发现,p在运行时地址不断增加,
因此释放p的时候地址已经不是初始地址,所以也会发生错误。
运行时就会发生以下情况。
void test()
{
int* p = (int*)malloc(100);
free(p);
free(p);//重复释放
}
int main()
{
test();
return 0;
}
下面再来看这串代码,我们会发现,这串代码中我们使用了两次free进行内存释放。
这样也会放生错误,运行一下看一下:
依然会发生这种错误。
void test()
{
int* p = (int*)malloc(100);
if (NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while (1);
return 0;
}
再看这串代码,我们会发现我们没有进行内存释放,然后while进行死循环,所以这个代码就会造成内存泄漏。因为有的服务器会二十四小时不停的进行的,就像一些游戏服务器,二十四小时不停的进行,如果不进行内存回收,那么最后就会造成内存泄漏问题。
本篇文章我们总结了一些我们使用动态内存分配的时候常见的一些错误,我们在使用时一定要规避这些错误。