经典笔试题
题目1
void GetMemory(char* p)
{
p = (char*)malloc(100);
//在函数结束之后,p会被释放
}
void Test(void)
{
char* str = NULL;
GetMemory(str); //无法完成动态开辟
strcpy(str, "hello world");
printf(str);
}
void main()
{
Test();
}
上述代码就是很经典的函数参数的寿命问题,参数p在函数GetMemory结束之后,p会被释放,这一点可以通过对程序的逐步调式发现。
题目2
char* GetMemory(void)
{
//若修改为static char p[] = "hello world";
//则结果正确
char p[] = "hello world";
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
void main()
{
Test();
}
上述代码的问题就在于,p也是一个局部变量,虽然return了p,却也只是将p的地址传给了str,但是该地址里存放的内容在GetMemory函数结束之后也会被释放,所以str并不会接收到“hello world”
题目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);
//free(str);
}
void main()
{
Test();
}
上述代码没有大问题,若是严格的话,就是没有释放。
题目4
void Test(void)
{
char* str = (char*)malloc(100);
if (str != NULL)
{
strcpy(str, "hello");
printf(str);
free(str); //释放空间
//str = NULL; //释放指针
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
}
void main()
{
Test();
}
本文通过四个经典笔试题探讨了C/C++中动态内存管理的常见误区及陷阱,涉及内存分配、释放、局部变量作用域等问题。

576

被折叠的 条评论
为什么被折叠?



