有关内存的思考题

来源:百度知道 编辑:UC知道 时间:2024/05/18 07:49:35
1)void GetMemory(char *p)
{
p=(char*)malloc(100);
}

void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"Hello world");
printf(str);
}
请问运行Test函数会有什么样的结果?

2)char *GetMemory(void)
{
char p[]="hello world";
return p;
}

void Test(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
}
请问运行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函数会有什么样的结果
以上程序段均在C++环境下运行

1中,用子函数申请动态内存成功,但是主函数得不到该内存,因为无法把内存首地址传递给主程序,子函数只是使用了一下主函数的指针值,并不能返回给主程序,运行会程序崩溃;
2中,不能准确地输出子函数中的字符串,因为子函数调用结束时,它占用的内存就被释放,主函数输出的是一个随机的字符串;
3中,程序完全正确,子函数利用参数(地址)成功的为主函数申请了动态内存;
4中,程序没错,但是漏洞很大,动态内存被free掉之后,并不等于NULL,而是一个随机的野指针,必须人为设置为NULL才行,后面对野指针赋值成功,因为str不为空,只是指向一块随机内存,输出字符串成功。

其中,3是正确的做法,不过子函数给主函数申请动态内存,也可以这样
void GetMemory(char*& p,int num)
{
p=(char*)malloc(num);
}
即引用主函数中的指针。