🌊 前言
通过对上章动态内存管理的学习,大家对相关知识有了一定的掌握,下面作者将会和大家通过做一些列题来加强对其的理解,希望对大家有所收获。
🌀1.题目(一)
错误代码:
void GetMemory(char* p)
{
p = (char*)malloc(100);
}
void test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
int main()
{
test();
return 0;
}
- 如果需要改变str,改变变量用一级指针,改变指针用二级指针,但传入的是一级指针,所以没有对str中存放的地址NULL进行改变,所以后面执行strcmp和strcat的内容会让程序崩溃。
- 动态申请内存有可能失败,所以应该增加判断。
- 动态创建的内存没释放。
正确办法:一级指针传递的函数内部更改不影响实参一级指针的值,所以此处要么使用二级指针,要么使用引用。
void GetMemory(char** p)
{
*p = (char*)malloc(100);
}
void test(void)
{
char* str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
}
int main()
{
test();
return 0;
}
🌀2.题目(二)
错误写法:
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
错误原因:
- 因为p的生命周期在GetMemory函数执行完了就被销毁了,str指向的是个野指针。
- GetMemory 并不能传递动态内存,Test 函数中的 str 一直都NULL,strcpy(str, “hello world”);将使程序崩溃。篡改动态内存区的内容,后果难以预料,非常危险,因为free(str);之后,str 成为野指针。if(str != NULL)语句不起作用。
🌀3.题目(三)
错误写法:
void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
- 程序可以打印出"hello",但是没有进行内存释放,所以需要进行内存释放。
正确办法:及时进行内存释放,防止内存泄露。
void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
//忘记释放
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
🌀4.题目(四)
错误写法:
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
- 在执行 char *str = (char *) malloc(100); 后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上: str = NULL;
正确写法:
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
str = NULL;
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
🎊总结
通过对上述笔试题的练习,我相信大家已经对动态内存管理的相关内容已经有所掌握,下章我们将会进行1柔性数组的学习,希望小伙伴们坚持学下去。