2014-02-25 72 views
0

最近我遇到了一个小问题,困扰了我很长一段时间,但遇到了一些解释。虽然它仍然有点混乱。数据和堆栈部分

char *getString() 
{ 
    char *str = "Print Me!"; 
    return str; 
} 

int main() 
{ 
    printf("%s", getString()); 
    getchar(); 
    return 0; 
} 

给出输出为: Print Me!

虽然

char *getString() 
{ 
    char str[] = "Print Me!";  
    return str; 
    } 
int main() 
{ 
    printf("%s", getString()); 
    getchar(); 
} 

给出一个垃圾值。为什么如此。

+1

如果你的编译器遇到警告级别,一个体面的人会发出这个bug的诊断。 –

回答

2

这里:

char *getString() 
{ 
    char str[] = "Print Me!";  
    return str; 
} 

要返回自动存储持续时间的对象。对象的生命周期是它声明的块。所以在函数返回后,你的对象被销毁并试图访问调用未定义的行为。

但在这里:

char *getString() 
{ 
    char *str = "Print Me!"; 
    return str; 
} 

str指针指向一个字符串字面量和字符串具有静态存储持续时间。具有静态存储持续时间的对象的生存期是程序的整个生命周期。然后在函数返回后访问字符串,然后完美定义。

+0

在第一个例子中对'str'的​​声明使用'static'修饰符会绕过它。 – t0mm13b

+0

这完全有道理。刚刚通过K&R,第5.5节。谢谢 –