动态内存管理的几个经典笔试题
出自《高质量的C—C++编程》
题目1:
图解
代码
void GetMemory(char* p)
{
p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");//1.对空指针无法进行解引用操作
printf(str);//2.无法打印NULL
}
int main()
{
Test();
return 0;
}
有关printf的写法
传给函数的值——首元素的地址(h)
printf("hello world");
//等价于:
chr* p="hello world";
printf(p);
修改1
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(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:
返回栈空间地址的问题
char* GetMemory(void)
{
char p[] = "hello world";//局部变量,出函数即销毁
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
对比写法
可行
不可行
int* test()
{
int a = 10;
return &a;
}
int main()
{
int *p = test();
printf("%d\n", *p);
return 0;
}
题目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);
str = NULL;
}
题目4:
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
修改
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
//未置空(补充一条语句)
str = NULL;
if (str != NULL)
{
//str是野指针,这里就是非法访问
strcpy(str, "world");
printf(str);
}
}