提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
OK,兄弟们,今天我们来学习几道关于动态内存的笔试题。
笔试题及其解析
1、第一题
void GetMemory(char* p)
{
p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
1.调用GetMemory函数时,str为值传递,p是str的临时拷贝,所以在GetMemory函数内部将动态开辟空间的地址存放在p中的时候,不会影响str,所以GetMemory函数返回之后,str中依然是NULL指针。strcpy函数就会调用失败,原因是对NULL的解引用。
2.同时,GetMemory函数中malloc申请的空间没有释放,造成内存泄漏。
2、第二题
char* GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
返回栈空间地址的问题
GetMemory函数内部创建的数组是临时的,虽然返回了数组的起始地址给了str,但是数组的内存出了GetMemory函数就被回收了,但是str还保留着数组的起始地址,这时候如果使用str,str就是野指针。
就像你租房子,已经不再租了,但是你还保留着钥匙,这时如果你使用这个钥匙,那肯定是违法的。
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);
}
这个比较简单,只有一个问题,就是GetMemory函数内部malloc申请的空间没有释放,会导致内存泄漏。
4、第四题
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
free之后,str所指向的空间已经还给操作系统了,这时再使用这块空间就是非法访问,free之后应该将str置空。
总结
OK,兄弟们,这就是今天要将的内容,大家学废了吗?希望大家都能找到一份好工作。