请写出下面三个代码段的执行结果并详述原因,谢谢!

代码段1:voidGetMemeory(char*p){p=(char*)malloc(100);}voidTest(){char*str=NULL;GetMemory(... 代码段1:
void GetMemeory(char *p){
p=(char*)malloc(100);
}
void Test()
{
char *str=NULL;
GetMemory(str);
strcpy(str,”helloworld”);
printf(str);
}
运行Test函数会有什么结果?
代码段2:
char *GetMemory(void){
char p[]="helloworld";
return p;
}
void Test(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
}
运行Test函数会有什么结果?
代码段3:
void GetMemory2(char **p,int num)
{
*p=(char*)malloc(num);
}
void Test(void)
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
printf(str);
}
运行Test函数会有什么结果?
第三段写错了,GetMemory2应为GetMemory
展开
 我来答
空号一号
2014-08-04 · TA获得超过3845个赞
知道大有可为答主
回答量:1495
采纳率:0%
帮助的人:1607万
展开全部
代码段1:出错。
原因:Test在调用GetMemory时,会把指针str复制一份,作为p传递给GetMemory。也就是说Test里的str和GetMemory里的p是两个不同的指针,对p做的任何操作都不影响str,str一直是空指针。然后再向空指针调用strcpy就会出错。

代码段2:输出一段乱码。
原因:这个结果和堆栈有关。Test调用GetMemory函数时,会在内存堆栈区中给GetMemory函数开辟一块新的空间(下称“区域A”),然后GetMemory的参数、局部变量等都在区域A里,于是GetMemory里面的局部变量char p[]也指向区域A里的字符串"helloworld"(注1)。问题在于GetMemory函数结束后,区域A会被释放,里面的一切内容失去意义,变成不可预测的随机值。GetMemory把p作为返回值返回给Test中的指针str,GetMemory结束后,str仍然指向区域A中的某位置,但这个位置的值已经变成随机值,所以printf会打印出随机字符,即乱码。

注1:这里我不是很确定。根据我以前的知识,常量字符串"helloworld"应该不在堆栈区里,不会随着函数的执行与结束而变化,代码段2理应输出"helloworld",但执行结果还确实是乱码,我目前只能想到上述解释。

代码段3:输出hello。
原因:由于Test和GetMemory之间传递的是指针的指针,所以和代码段1不同,这次两者修改的是同一个指针。GetMemory结束后,Test中的str指向堆里一个100字节的区域,然后再用strcpy向其中复制一个字符串'hello",所以输出结果也就是"hello"。

以上执行结果经过Visual Studio 2013测试。
紫轩啊三思
2017-09-26
知道答主
回答量:2
采纳率:0%
帮助的人:1769
引用空号一号的回答:
代码段1:出错。
原因:Test在调用GetMemory时,会把指针str复制一份,作为p传递给GetMemory。也就是说Test里的str和GetMemory里的p是两个不同的指针,对p做的任何操作都不影响str,str一直是空指针。然后再向空指针调用strcpy就会出错。

代码段2:输出一段乱码。
原因:这个结果和堆栈有关。Test调用GetMemory函数时,会在内存堆栈区中给GetMemory函数开辟一块新的空间(下称“区域A”),然后GetMemory的参数、局部变量等都在区域A里,于是GetMemory里面的局部变量char p[]也指向区域A里的字符串"helloworld"(注1)。问题在于GetMemory函数结束后,区域A会被释放,里面的一切内容失去意义,变成不可预测的随机值。GetMemory把p作为返回值返回给Test中的指针str,GetMemory结束后,str仍然指向区域A中的某位置,但这个位置的值已经变成随机值,所以printf会打印出随机字符,即乱码。

注1:这里我不是很确定。根据我以前的知识,常量字符串"helloworld"应该不在堆栈区里,不会随着函数的执行与结束而变化,代码段2理应输出"helloworld",但执行结果还确实是乱码,我目前只能想到上述解释。

代码段3:输出hello。
原因:由于Test和GetMemory之间传递的是指针的指针,所以和代码段1不同,这次两者修改的是同一个指针。GetMemory结束后,Test中的str指向堆里一个100字节的区域,然后再用strcpy向其中复制一个字符串'hello",所以输出结果也就是"hello"。

以上执行结果经过Visual Studio 2013测试。
展开全部
注1:这里我不是很确定。根据我以前的知识,常量字符串"helloworld"应该不在堆栈区里,不会随着函数的执行与结束而变化,代码段2理应输出"helloworld",但执行结果还确实是乱码,我目前只能想到上述解释。
当 为static char p[]="hello world"时 栈区释放后不消亡 结果打印为 hello world

最后一个虽然能正常输出hello,但是没有free掉 会造成内存泄漏
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式