我在一个页面中看到了一个示例,该示例概述了在 C 结构中表示字符串的各种方法。它解释了在 main 之外的函数中定义的数组将存储在堆栈段中,因此在其返回后不一定存在,可能会导致运行时错误。
突出显示的可能重复解释了返回时数组失败的原因,即返回的指向元素 0 的指针不再有效,但未显示相同存储类(自动)的变量成功的原因是它们通过了 A移除堆栈帧后仍然存在的值
“下面的程序可能会打印一些垃圾数据,因为字符串存储在函数 getString() 的堆栈帧中,而在 getString() 返回后数据可能不存在。”
char *getString()
{
char str[] = "GfG"; /* Stored in stack segment */
/* Problem: string may not be present after getSting() returns */
return str;
}
int main()
{
printf("%s", getString());
getchar();
return 0;
}
我知道其他局部 C 变量也将在它们各自的堆栈帧中定义,并且显然它们可以返回,所以为什么这对数组来说是个问题?
谢谢
最佳答案
这应该大致解释了发生了什么,从 getString() 返回后,它的堆栈不再有效。
^ ^
| not valid | ^ ^
+------------+ | not valid |
str--> | "GfG" | | not valid | <---+
| --- | | not valid | |
| stack of | +------------+ |
| getString | | return(str)| ----+
+------------+ | --- |
| | | |
| stack of | | stack of |
| main() | | main() |
+------------+ +------------+
如果用 gcc -W -Wall 编译(应该总是使用这些选项),它应该给出警告:
warning: function returns address of local variable [-Wreturn-local-addr]
关于c - 堆栈段 C 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54776872/