Sign-up....

这个程序为什么不正确?

char *GetHello (void)

{ char str[]="hello";

return str;

}

main()

{ char *p;

p=GetHello();

printf("%s",p);

getch();

}

为什么不能得到正确结果?

[145 byte] By [msdn] at [2007-8-14 20:08:12]
# 1 Re: 这个程序为什么不正确?

函数GetHello里面的str指向的空间在函数返回后就被释放了,返回值代表的指针也就是p是个野指针。

idler at 2004-12-4 22:09:18 >
# 2 Re: 这个程序为什么不正确?

应该对的呀,“hello”是静态文字常量啊。

great_chenliang at 2004-12-4 22:18:33 >
# 3 Re: 这个程序为什么不正确?

呵呵,很明显的错误:

char *GetHello (void)

{ char str[]="hello";//这里是在栈上分配的局部变量,str的内容在出了GetHello函数后就消失了

return str; //返回的是局部变量指针,不正确的

}

main()

{ char *p;

p=GetHello();//什么也得不到

printf("%s",p);//出异常了!!!!

getch();

}

hawkxjy at 2004-12-4 22:20:51 >
# 4 Re: 这个程序为什么不正确?

楼上兄弟能否改正一下,怎样传回一个指针(不通过参数传递)?

BingGroup at 2004-12-4 22:22:03 >
# 5 Re: 这个程序为什么不正确?

“hello”是静态文字常量,但是str是局部变量,所以"hello"是在栈上存在的,出了函数还是什么都没了

hawkxjy at 2004-12-4 22:23:10 >
# 6 Re: 这个程序为什么不正确?

char *GetHello (void)

{ string* str=new string("hello");

return str.c_str();

}

hawkxjy at 2004-12-4 22:24:51 >
# 7 Re: 这个程序为什么不正确?

如果改成这样的,那就可以拉吧

char *GetHello (void)

{ static char str[]="hello";

return str;

}

main()

{ char *p;

p=GetHello();

printf("%s",p);

getch();

}

shibazi at 2004-12-4 22:33:52 >
# 8 Re: 这个程序为什么不正确?

楼上正解

idler at 2004-12-4 22:39:14 >
# 9 Re: 这个程序为什么不正确?

哦~shit,我没看清楚。

char str[] = "hello";

这里的“hello”是用于初始化str这个数组的。楼主要得到你要的效果,只需这样写,

const char* foo(void)

{

return "hello";

}

我一开始误以为是付给指针的。以上为只读版。

char* bar(void)

{

static char str[] = "hello";

return str;

}

这个为可写版,也就是楼上朋友的版本。

great_chenliang at 2004-12-4 22:40:09 >
# 10 Re: 这个程序为什么不正确?

char *GetHello (void)

{

return "hello";

}

这样也可以,因为"hello"是一个常量,保存在常量区。不会因为GetHello的返回而释放。但不要试图去修改返回指针的内容,因为其内容是常量,常量不可修改,否则会出错。

例如 char *p; p=GetHello; p[1]='a'; 这样会出错。

但是你可以改变p指向的地址,例如p=GetHello; p=“OK”;这样不会有问题。

Michael_555 at 2004-12-4 22:50:38 >
# 11 Re: 这个程序为什么不正确?

"hello"是局部常量,请问编译是为它分配内存吗?还是在调用时为她分配呢?如果在编译时分配,那一定是静态存储区了;如果在调用时分配,就是栈内存了。看现在的情况应该是后者,那位大虾给解释一下

tcdddd at 2004-12-4 22:57:09 >
# 12 Re: 这个程序为什么不正确?

此“hello”非彼“hello”。

楼主的程序在运行时静态存储区和栈上都存在(存在过)“hello”。

great_chenliang at 2004-12-4 23:01:16 >
# 13 Re: 这个程序为什么不正确?

怎么又是这个?

不过有办法可以让你这个程序出现正确的结果(前提是编译器不要乱优化)

char *GetHello (void)

{

double dval;

char str[]="hello";

return str;

}

虽然这样仍然是非法访问,但是这也是一种技巧性的行为(使用起来有一定的危险)

定义一个double类型的变量是因为你后面的printf是双参数的,如果你直接用printf(p)的话,只需要一个int类型的参数就可以了(或者你定义一个参数也可以)

somedummy at 2004-12-4 23:03:20 >
# 14 Re: 这个程序为什么不正确?

如果要确保编译器不会乱作手脚的话,最好在return之前加入一个dval=1;这样可以让编译器少动手脚

somedummy at 2004-12-4 23:04:31 >
# 15 Re: 这个程序为什么不正确?

char *GetHello (void)

{ char str[]="hello";

return str;

}

char str[]是一个局部变量,当函数返回的时候就释放掉了。

"hello"是一个字符串常量,要等你程序结束时才会释放掉。

Michael_555 at 2004-12-4 23:08:28 >
# 16 Re: 这个程序为什么不正确?

不明白,1,那位大虾给解释一下全局常量和局部常量的内存分配问题。2,楼上所说的技巧是什么原理呢?请赐教

tcdddd at 2004-12-4 23:13:37 >
# 17 Re: 这个程序为什么不正确?

纠正一下,我的想法好像有点错误,今天没有时间修正了,明天好好修正一下

somedummy at 2004-12-4 23:19:30 >
# 18 Re: 这个程序为什么不正确?

楼主,可以看看这个:

http://dev.csdn.net/develop/article/19/19535.shtm

Michael_555 at 2004-12-4 23:55:12 >
# 19 Re: 这个程序为什么不正确?

"hello"是一个字符串常量,应该是放在代码段的,属于静态的东西。

str 变量属于临时变量,存在堆栈中,当函数释放后,

如果没有新的函数调用,str指针中的地址依然指向“hello”的位置,

如果有新的函数调用,str指针指向的位置会被修改,不再指向“hello”。但“hello”依然是存在的。

liker at 2004-12-5 22:12:43 >

C/C++

All Classified