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

buc*_*h11 1 c string pointers dangling-pointer

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

char *someFun(){
    char *temp = "string constant";
    return temp;
}
int main(){
    puts(someFun());
}
Run Code Online (Sandbox Code Playgroud)

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

char *someFun1(){
    char temp[ ] = "string";
    return temp;
}
int main(){
    puts(someFun1());
}
Run Code Online (Sandbox Code Playgroud)

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

Mah*_*esh 5

char *temp = "string constant";
Run Code Online (Sandbox Code Playgroud)

string constant文字位于只读段.它在程序终止时被取消分配.所以,你可以有一个指向它的引用.

char temp[ ] = "string";
Run Code Online (Sandbox Code Playgroud)

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

  • 顺便说一句,为了避免在处理字符串文字时出现问题,你应该在`const char*`变量中存储它们的指针,因此如果你试图修改它们,编译器会阻止你. (2认同)