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

char*GetMemory(void){charp[]=""helloworld"";returnp;}voidTest(void){char*str=NULL;str... char *GetMemory(void){
char p[] = ""hello world"";
return p;
}
void Test(void){
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test 函数会有什么样的结果? 3 分
A. 程序编译错误 B. 输出“hello world” C. 无效的指针,输出不确定 D. 输出“NULL”
展开
 我来答
帐号已注销
2020-10-30 · TA获得超过77.1万个赞
知道小有建树答主
回答量:4168
采纳率:93%
帮助的人:167万
展开全部

选C

因为p的生命周期在GetMemory函数执行完了就被销毁了,str指向的是个野指针

 GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。篡改动态内存区的内容,后果难以预料,非常危险,因为free(str);之后,str 成为野指针。if(str != NULL)语句不起作用。

扩展资料:

函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用ch替换并返回s 。

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度。

参考资料来源:百度百科-memset

yuanbin198759
2011-06-17
知道答主
回答量:5
采纳率:0%
帮助的人:5.5万
展开全部
选C,可能是乱码,也有可能是正常输出,因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原来的内容已经被清除,新内容不可知,程序员面试宝典里有专门讲该部分知识的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dexahh
推荐于2018-03-13 · TA获得超过354个赞
知道答主
回答量:216
采纳率:100%
帮助的人:290万
展开全部
选C 因为p的生命周期在GetMemory函数执行完了就被销毁了,str 指向的是个野指针
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
雪写江山
2011-06-13 · 超过35用户采纳过TA的回答
知道答主
回答量:111
采纳率:0%
帮助的人:103万
展开全部
答案是D, 我确定 因为free(str)是可以无限次的通过的,上边的p是子函数的一个形式参数,不会改变str的值,因此str仍然为NULL。free(NULL)没有任何问题。
最后输出<NULL>.。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tanshu87654321
2011-06-02
知道答主
回答量:29
采纳率:0%
帮助的人:18.1万
展开全部
A
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式