为什么以下两个代码提供不同的结果?

时间:2017-09-03 01:17:23

标签: c pointers dangling-pointer

  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());
    }
    
  3. 在上述两个代码中,返回了char指针,指向可能被覆盖的局部变量但仍然代码1成功运行,而代码2打印Garbage值。

1 个答案:

答案 0 :(得分: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 =&#34; 123&#34;数据段中的点(https://en.wikipedia.org/wiki/Data_segment),但char []位于堆栈。

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