#include <stdio.h>
char* fun1()
{
char *s="hello";
return s;
}
char* fun2()
{
char s[6]="hello";
return s;
}
main()
{
char *str;
str = fun1();
printf("%s",str);//hello
str = fun2();
printf("%s",str);//garbage value
}
代码的输出是 - hello和一些垃圾。 我不明白虽然fun1和fun2中的两个变量都是各自函数的本地变量,为什么输出就是这样。两个函数调用都返回局部变量的地址,返回的地址应该包含垃圾值,这在fun1情况下不是真的它打印“你好”。
答案 0 :(得分:6)
因为在第二种情况下,对象存在于fun2
的堆栈中,而在第一种情况下,它存在于某个固定区域中。一旦fun2
的调用结束,它就会超出范围,即它会死亡。
两个函数调用都返回局部变量的地址
fun1
堆栈上的实际内容是只是一个指针,而不是内容本身。所以你要将一个指针返回到保证生活的东西,直到程序结束 - 一个字符串文字。
答案 1 :(得分:0)
在第二个函数中,您将返回指向局部变量的指针。
一旦fun2()调用完成,分配给s [6]的内存就被释放,因此指针指向内存中的某个无效位置。
您可以按如下方式修改代码:
char* fun2(char *s)
{
strcpy(s, "hello");
}
char str[6];
fun2(str);
printf("%s",str);
现在str [6]变量在fun2()之外分配,所以当fun2()退出时,这个变量的内存不会被释放。
编辑:请注意,上面的代码不安全,因为fun2()不会检查或以任何方式控制它写入内存的字节数。