2
#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
}

代码的输出是 - 你好和一些垃圾。我不明白虽然 fun1 和 fun2 中的两个变量都是它们各自函数的本地变量,但为什么输出会这样。两个函数调用都返回局部变量的地址,并且返回的地址应该包含垃圾值,这在 fun1 情况下不正确,因为它正在打印“你好”。

4

2 回答 2

6

因为在第二种情况下,对象存在于堆栈中,fun2而在第一种情况下,它存在于某个固定区域。一旦调用fun2结束,它就会超出范围,即它会死掉。

两个函数调用都返回局部变量的地址

实际上在堆栈上的fun1只是一个指针,而不是内容本身。所以你返回一个指针,指向一个保证在程序结束之前一直存在的东西——一个字符串文字。

于 2013-02-27T11:29:36.163 回答
0

在第二个函数中,您将返回指向局部变量的指针。

一旦 fun2() 调用完成,分配给 s[6] 的内存就会被释放,因此指针指向内存中的某个无效位置。

您可以按如下方式修改您的代码:

char* fun2(char *s)
{
    strcpy(s, "hello");
}

char str[6];
fun2(str);
printf("%s",str);

现在 str[6] 变量是在 fun2() 之外分配的,所以当 fun2() 退出时,该变量的内存不会被释放。


编辑:请注意,上面的代码并不安全,因为 fun2() 不会检查或以任何方式控制它写入内存的字节数。

于 2013-02-27T11:31:41.250 回答