1

当我们运行这段代码时,它可以正常工作并string constant在屏幕上打印:

char *someFun(){
    char *temp = "string constant";
    return temp;
}
int main(){
    puts(someFun());
}

但是当我们运行以下类似的代码时,它不会工作并在屏幕上打印一些垃圾:

char *someFun1(){
    char temp[ ] = "string";
    return temp;
}
int main(){
    puts(someFun1());
}

背后的原因是什么?本质上,这两个函数都做类似的事情(即返回一个“字符串”),但它们的行为仍然不同。这是为什么?

4

2 回答 2

5
char *temp = "string constant";

string constant文字位于只读段上。它在程序终止时被释放。所以,你可以有一个指向它的参考。

char temp[ ] = "string";

string被复制到temp驻留在堆栈上的哪个位置。当函数返回时,堆栈的展开开始释放函数范围内的变量。但是您正在返回对它的引用,该引用不再存在于堆栈中,因此您得到了垃圾。但有时你可能仍然会得到正确的结果,但你不应该依赖它。

于 2011-09-17T06:14:20.367 回答
3

在第一种情况下,指针temp将指向一个全局常量 storage "string constant"。因此,当您返回指针时,它是有效的。

在第二种情况下,'"string"' 只是堆栈上的一个 char 数组 - 从函数返回后它会死掉。

于 2011-09-17T06:10:57.890 回答