在这种情况下char []和char *有何不同?

时间:2011-09-17 06:08:35

标签: c string pointers dangling-pointer

当我们运行这段代码时,它会正常工作并在屏幕上打印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());
}

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

2 个答案:

答案 0 :(得分:5)

char *temp = "string constant";

string constant字面意思位于只读段。它在程序终止时被取消分配。所以,你可以有一个指向它的参考。

char temp[ ] = "string";

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

答案 1 :(得分:3)

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

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