我对中软的第三题关于“内存”的题目感兴趣,特拿来探讨。题目如下:
三. 有关内存的思考题
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来说,这种写法也是不被允许的。