一道面试题,请指点
char *GetMemory(void){
char p[] = "hello world";
return p;
}
void Test(void){
char *str = NULL;
str = GetMemory();
printf(str);
}
这道题运行test函数,为什么是"无效指针,输出不确定"?
问题点数:20、回复次数:16Top
1 楼firetoucher(风焱)回复于 2006-03-17 17:46:37 得分 10
char p[] = "hello world";
等于
char p[11] = "hello world";
局部存储空间,在函数返回以后该空间无效。
改为
char *p = "hello world";//有trap,不过在很多编译能满足上面代码的要求
static char p[] = "hello world";
FT
--
Anything one man can imagine, other men can make real.Top
2 楼jixingzhong(瞌睡虫·星辰)回复于 2006-03-17 19:53:36 得分 5
栈 空间指针,
函数返回后,
空间被释放,
内容将不可预测 ~
为无效操作指针 ~Top
3 楼liu_kewei(可为)回复于 2006-03-17 20:53:35 得分 0
细节,还是细节.Top
4 楼fiftymetre(50米深蓝)回复于 2006-03-17 21:29:45 得分 0
局部存储空间 的问题。楼上面说的都是有道理的。Top
5 楼bohlee(我心澎湃)回复于 2006-03-17 21:30:19 得分 0
高质量c++编程指南Top
6 楼ytfrdfiw()回复于 2006-03-18 08:16:44 得分 0
p的作用域(有效期)只在GetMemory中,有一种变通的方法可以实现以上功能,代码如下:
void GetMemory(char **p)
{
*p = (char *)malloc(10);//见笑,c的写法
strcpy(*p,"Hello");
}
int main(void)
{
char *p = "whatsss";
cout << p << endl;
GetMemory(&p);
cout << p << endl;
return 0;
}Top
7 楼ugg(逸学堂(exuetang.net))回复于 2006-03-18 10:10:14 得分 0
栈变量,在函数调用结束后,就会自动释放。
如下没有问题了
static char p[] = "hello world";
或者
char *p = "hello world";
Top
8 楼lic_zzg()回复于 2006-03-18 10:16:41 得分 0
面试中考这类题都BT。。。
Top
9 楼lic_zzg()回复于 2006-03-18 10:18:02 得分 0
高质量C/C++。。。真是。。。没法说了。。
下回,劝大家再去面C工作,建议把高质量C/C++熟背。。让他再考!!!!!!Top
10 楼Acoolice()回复于 2006-03-18 10:22:38 得分 0
学习Top
11 楼laofuxing(laofuxing)回复于 2006-03-18 10:48:32 得分 0
这都是基本功,如果这也叫变态,你还是不要当程序员了!Top
12 楼guojiwei2002(心如止水)回复于 2006-03-18 12:33:51 得分 0
程序的编写总是在不段的出错中积累起来的!Top
13 楼hustacsky(见好不收)回复于 2006-03-18 12:44:41 得分 5
char *GetMemory(void){
char p[] = "hello world";
return p;
}中的p是数组,数组是存储在栈上,而栈空间在函数结束后就释放了,所以返回的指针其实其空间已经被释放了!就变成了"无效指针,输出不确定"?Top
14 楼zhouyinhui(我也飘~~过)回复于 2006-03-18 14:31:41 得分 0
这是面试题,还是在书上抄的,昨天我刚在某书上看到这题, 欺骗是不对的Top
15 楼tudoushishei(土豆)回复于 2006-03-18 18:28:04 得分 0
这道题以前见过(在csdn上),数组存放在堆栈内存中,释放掉了。Top
16 楼ttlyfast()回复于 2006-03-18 18:34:23 得分 0
markTop





