请教关于return 返回值的问题
int fun1(){
int temp=10;
return temp;
}
char * fun2()
{
char * str="i love you";
return str;
}
char * fun3()
{
char str[]="i love you";
return str;
}
void main()
{
int a=fun1();//OK
char *str=fun2();//ok
char *str2=fun3();//为什么这个就不能获得返回值呢。
}
想请教下 fun1()执行完后 ,temp不是会被销毁吗,为什么还可以在主函数中获得值。fun2()与fun3()的区别是?想了好久都搞不懂
[[it] 本帖最后由 dyflovexlp 于 2008-5-4 21:00 编辑 [/it]]
----------------解决方案--------------------------------------------------------
char str[] = "i love you"; 这个是一个字符数组,该函数结束这个数组就无效了。
char * str = "i love you"; str 是一个指向字符串的指针
"i love you" 是一个字符串字面值,是一个字符串常量,该常量在编译时就分配了内存空间,而函数中的数组是进入函数是分配的,函数结束就不存在了。
----------------解决方案--------------------------------------------------------
fun1()中相当于return 10;
fun2()中相当于return "i love you";
fun3()返回的是一个数组名,即一个地址,函数结束后,这个地址不再有意义。
----------------解决方案--------------------------------------------------------
int main(void) // C 标准是这样的
{
}
void main() 不存在于C标准中,只是某些编译器允许而已,一个严格遵守C标准编译器是不允许的。(很多编译器忽略这个错误)
----------------解决方案--------------------------------------------------------
COSDOS来的好快,我还以为我座沙发了呢,发完了才知道只剩下板凳了
----------------解决方案--------------------------------------------------------
我看了不懂原因,现在才明白哈哈
----------------解决方案--------------------------------------------------------
地址的返回与c++引用返回是不一样的
2与3得区别是
* str="i love you",str是常量指针,编译器知道接受到'\0'结束,所以函数返回一个地址编译器认为安全,然后返回给一个指针所以不会删除;
char str[]="i love you";这个虽然也返回一个地址,但是生存期结束后数组就失效了,由于不知道长度('\0'不是结束标记),由于释放后地址会被重用..其实也是可以返回的char str1=*fun3();printf("%c",str1);但是马上这段地址就被用了.你可以调试下
----------------解决方案--------------------------------------------------------
#include<cstdio>
char c[100];
char * fun()
{
char str[]={"i love you"};
return str;
}
void arr()
{ int i=0;
char *p=fun();
while((c[i++]=*p++)!='\0');
}
void main()
{
arr();
printf("%s",c);
}
----------------解决方案--------------------------------------------------------
谢谢大家。。。有点明白了,请问这方面的知识在什么书上有涉及的。。。
----------------解决方案--------------------------------------------------------