一个“中软”的关于内存的笔试题

我对中软的第三题关于“内存”的题目感兴趣,特拿来探讨。题目如下:

三.    有关内存的思考题
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 函数会有什么样的结果.

答案很简单,1 运行过程中会出现错误 2 会输出 乱码

题目看似不难,但程序员,尤其是初级的程序员在写代码时很容易犯的一个毛病。

C语言中,实参变量和形参变量之间的数据传递是单向的“值传递”方式,指针变量作函数参数也要遵循这一原则。调用函数不能改变实参指针变量的值(即指针的地址),但可以改变实参指针变量所指变量的值。

程序1就试图改变 str 的值,肯定不成功,getmemory执行完后,str还是NULL,所以在执行strcpy时,程序试图给NULL的指针赋值,会发生运行时错误。

程序2的问题在于 getmemory函数试图返回局部变量的地址。众所周知,局部变量的生命只存在于该函数体内,一旦离开该函数体,该局部变量便在内存中消失,所以str得到的只能是乱码。当然也不排除在某些特定的编译器上会输出“hello,world”字样。但严格的按照标准C来说,这种写法也是不被允许的。

永不止步步 发表于09-30 15:38 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363791个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号