-1
  1. 第一段代码是:

    #include <stdio.h>
    char *getString()
    {
        char *str = "Will I be printed?";
        return str;
    }
    int main()
    {
        printf("%s", getString());
    }
    
  2. 第二段代码是:

    #include <stdio.h>
    char *getString()
    {
        char str[] = "Will I be printed?";
        return str;
    }
    int main()
    {
        printf("%s", getString());
    }
    

在上述两个代码中,返回的 char 指针指向一个可能被覆盖的局部变量,但 code-1 仍然成功运行,而 code-2 打印垃圾值。

4

1 回答 1

0

让我们稍微扩展一下您的示例,看看我们的数据存储在哪里:

#include <stdio.h>

char* some_static_var="123";

char *getString1()
{
    char *str = "Will I be printed?";
    return str;
}

char *getString2()
{
    char str[] = "Will I be printed?";
    return str;
}

int main()
{
    int some_var_at_stack=1;
    printf("%p\n", &some_var_at_stack);
    printf("%p\n", some_static_var);
    printf("%p\n", getString1());
    printf("%p\n", getString2());
}

我们得到了什么?在我的 32 位系统上:

0xbfc2005c

0x80497bc

0x8048554

0xbfc20035

如您所见, char* var="123" 指向数据段(https://en.wikipedia.org/wiki/Data_segment),但 char[] 位于堆栈中。

每次,当你离开你的函数,你在堆栈中分配任何变量时,这个变量都会变得未定义,因为在堆栈(指针也是)分配的数据在函数外部无效。但是在 getString1() 中实际上返回指针值到堆栈外的数据段,所以这个函数正常工作,但分配的指针在函数退出时未定义。

于 2017-09-03T03:27:12.733 回答