今年秋季的校园招聘已经接近尾声,笔试面试也参加了不少。发现有一道题经常出现,特拿来分享。
问题1:
void getmemory(char *p)
{
p = (char *)mallol(100);
}
void test(void)
{
char *str = NULL;
getmemory(str);
strcpy(str,”hello,world”);
printf(str);
}
请问运行Test函数会有什么样的结果?
问题2:
char*getmemory(void)
{
char p[] = ”helloworld”;
return p;
}
void test(void)
{
char *str = NULL;
str=Getmemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
答案很简单,1 运行过程中会出现错误 2会输出 乱码
如果还有疑惑,gcc编译及运行结果将消除你的疑虑。
第一段代码在Ubunu下的运行结果:
看吧!明显的内存错误!
再看第2段代码:
gcc的编译警告大概已经很能说明问题了!
想必C语言高手会觉得这些问题很low level,可是不幸的是想我这样C语言不扎实的人经常会犯这样的错误!
C语言中,实参变量和形参变量之间的数据传递是单向的“值传递”方式,指针变量作函数参数也要遵循这一原则。调用函数不能改变实参指针变量的值(即指针的地址),但可以改变实参指针变量所指变量的值。
程序1就试图改变 str的值,肯定不成功,getmemory执行完后,str还是NULL,所以在执行strcpy时,程序试图给NULL的指针赋值,会发生运行时错误。
程序2的问题在于getmemory函数试图返回局部变量的地址。众所周知,局部变量的生命只存在于该函数体内,一旦离开该函数体,该局部变量便在内存中消失,所以str 得到的只能是乱码。
因此,说到底,还是要牢记千万不能返回局部变量的地址,还有小心有指针情况的“传值”!