一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。 realloc使用的注意事项:
1.如果p指向空间之后有足够的内存空间可以追加,则直接追加,后返回p
2.如果p指向空间之后没有足够的内存空间可以追加,则realloc函数会重新找一个新的内存区域,开辟一块满足需求的空间,并且把原来内存中的数据拷贝回来,释放旧的内存空间,最后返回先新开辟的内存地址
3.要用一个新的变量来接受realloc函数的的返回值
如
int* ptr = realloc(p, 40);
if (ptr != NULL)
{
p = ptr;
}
常见的动态内存的错误
1.对NULL指针的解引用操作
//错误示范
int main()
{
int* p = (int*)malloc(40);
//万一malloc失败,p就被赋值为NULL
//*p = 0;//err
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
free(p);
p = NULL;
return 0;
}
要对p进行相关的判断
2.对动态开辟的内存的越界访问
int main()
{
int* p = (int*)malloc(5 * sizeof(int));
if (p == NULL)
{
return 0;
}
else
{
int i = 0;
for (i = 0; i < 10; i++)
{
*(p = i) = i;
}
}
free(p);
p = NULL;
return 0;
}
3.对非动态开辟内存的free
int main()
{
int a = 10;
int* p = &a;
*p = 20;
free(p);
p = NULL;
return 0;
}
4.使用free释放动态开辟内存的一部分
int main()
{
int*p(int)malloc(40);
if (p == NULL)
{
return 0;
}
int i = 0;
for (i = 0; i < 10; i++)
{
*p++ = i;
}
//回收空间
free(p);
p = NULL;
return 0;
}
5.对同一块动态内存的多次释放ruhe
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
{
return 0;
}
//使用
//释放
free(p)
//......
free(p);
return 0;
}
如何避免:在free(p)后加上 p = NULL;
6.对动态开辟内存的空间忘记释放(内存泄漏)
while (1)
{
malloc(1);
}
return0;
几道经典题目:
1.这个程序出现了什么错误
void GetMemory(char* p)
{
p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
prinf(str);
}
int main()
{
Test();
return 0;
}