当我们运行这段代码时,它会正常工作并在屏幕上打印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());
}
背后的原因是什么?本质上,两个函数都做类似的事情(即返回一个“字符串”),但它们仍然表现不同。那是为什么?
答案 0 :(得分:5)
char *temp = "string constant";
string constant
字面意思位于只读段。它在程序终止时被取消分配。所以,你可以有一个指向它的参考。
char temp[ ] = "string";
string
被复制到驻留在堆栈上的temp
。当函数返回时,堆栈的展开开始,它在函数范围内解除分配变量。但是你要返回一个对它的引用,它不再存在于堆栈中,因此你会得到垃圾。但有时你可能仍然得到正确的结果,但你不应该依赖它。
答案 1 :(得分:3)
在第一种情况下,指针temp
将指向存储"string constant"
的全局常量。因此,当您返回指针时,它是有效的。
在第二种情况下,'“string”'只是堆栈中的一个char数组 - 从函数返回后会死掉。