这个程序为什么不正确?
char *GetHello (void)
{ char str[]="hello";
return str;
}
main()
{ char *p;
p=GetHello();
printf("%s",p);
getch();
}
为什么不能得到正确结果?
char *GetHello (void)
{ char str[]="hello";
return str;
}
main()
{ char *p;
p=GetHello();
printf("%s",p);
getch();
}
为什么不能得到正确结果?
函数GetHello里面的str指向的空间在函数返回后就被释放了,返回值代表的指针也就是p是个野指针。
应该对的呀,“hello”是静态文字常量啊。
呵呵,很明显的错误:
char *GetHello (void)
{ char str[]="hello";//这里是在栈上分配的局部变量,str的内容在出了GetHello函数后就消失了
return str; //返回的是局部变量指针,不正确的
}
main()
{ char *p;
p=GetHello();//什么也得不到
printf("%s",p);//出异常了!!!!
getch();
}
楼上兄弟能否改正一下,怎样传回一个指针(不通过参数传递)?
“hello”是静态文字常量,但是str是局部变量,所以"hello"是在栈上存在的,出了函数还是什么都没了
char *GetHello (void)
{ string* str=new string("hello");
return str.c_str();
}
如果改成这样的,那就可以拉吧
char *GetHello (void)
{ static char str[]="hello";
return str;
}
main()
{ char *p;
p=GetHello();
printf("%s",p);
getch();
}
楼上正解
哦~shit,我没看清楚。
char str[] = "hello";
这里的“hello”是用于初始化str这个数组的。楼主要得到你要的效果,只需这样写,
const char* foo(void)
{
return "hello";
}
我一开始误以为是付给指针的。以上为只读版。
char* bar(void)
{
static char str[] = "hello";
return str;
}
这个为可写版,也就是楼上朋友的版本。
char *GetHello (void)
{
return "hello";
}
这样也可以,因为"hello"是一个常量,保存在常量区。不会因为GetHello的返回而释放。但不要试图去修改返回指针的内容,因为其内容是常量,常量不可修改,否则会出错。
例如 char *p; p=GetHello; p[1]='a'; 这样会出错。
但是你可以改变p指向的地址,例如p=GetHello; p=“OK”;这样不会有问题。
"hello"是局部常量,请问编译是为它分配内存吗?还是在调用时为她分配呢?如果在编译时分配,那一定是静态存储区了;如果在调用时分配,就是栈内存了。看现在的情况应该是后者,那位大虾给解释一下
此“hello”非彼“hello”。
楼主的程序在运行时静态存储区和栈上都存在(存在过)“hello”。
怎么又是这个?
不过有办法可以让你这个程序出现正确的结果(前提是编译器不要乱优化)
char *GetHello (void)
{
double dval;
char str[]="hello";
return str;
}
虽然这样仍然是非法访问,但是这也是一种技巧性的行为(使用起来有一定的危险)
定义一个double类型的变量是因为你后面的printf是双参数的,如果你直接用printf(p)的话,只需要一个int类型的参数就可以了(或者你定义一个参数也可以)
如果要确保编译器不会乱作手脚的话,最好在return之前加入一个dval=1;这样可以让编译器少动手脚
char *GetHello (void)
{ char str[]="hello";
return str;
}
char str[]是一个局部变量,当函数返回的时候就释放掉了。
"hello"是一个字符串常量,要等你程序结束时才会释放掉。
不明白,1,那位大虾给解释一下全局常量和局部常量的内存分配问题。2,楼上所说的技巧是什么原理呢?请赐教
纠正一下,我的想法好像有点错误,今天没有时间修正了,明天好好修正一下
楼主,可以看看这个:
http://dev.csdn.net/develop/article/19/19535.shtm
"hello"是一个字符串常量,应该是放在代码段的,属于静态的东西。
str 变量属于临时变量,存在堆栈中,当函数释放后,
如果没有新的函数调用,str指针中的地址依然指向“hello”的位置,
如果有新的函数调用,str指针指向的位置会被修改,不再指向“hello”。但“hello”依然是存在的。