从函数返回局部变量在两种情况下给出不同的输出。

时间:2013-02-27 11:28:27

标签: c

#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情况下不是真的它打印“你好”。

2 个答案:

答案 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()不会检查或以任何方式控制它写入内存的字节数。