本文作者:小小白的崛起之路
更新日期: 2021.7.21
本文声明: 由于小小白水平有限,内容难免有错误和不准确之处,望读者批评指正!
动态内存管理相关知识链接:小小白关于动态内存知识的总结
题目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;
}
问题:运行Test 函数会有什么样的结果?
运行结果:
很显然,程序挂掉了。
原因分析:
代码完善:
改法 1:
char* GetMemory(char* p)
{
p = (char*)malloc(100);
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory(str);
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
改法 2:
void GetMemory(char** p)
{
*p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str);//传地址
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
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;
}
问题:运行Test 函数会有什么样的结果?
运行结果:
原因分析:
通俗来说:
题目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);
}
问题:运行Test 函数会有什么样的结果?
会心一笑,这个好像没毛病!运行结果也没问题。
运行结果:
看似结果好像没什么毛病,但是犯了动态内存中很致命的错误,还缺两步:
所以平时一定要注意细节!!
题目4:
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
问题:运行Test 函数会有什么样的结果?
运行结果
好像也没什么问题,但如果你看了我关于动态内存知识的分享以及对上面几个题有感受的话,那你一定认为有问题。
恭喜你,你进步了!
原因分析:
虽然malloc的空间被free了,但此时为非空,进入判断语句,此时属于非法访问空间。故应在free(str); 后面加上 str = NULL;
今天分享就到这里。