c - 堆栈段 C 数组

标签 c

我在一个页面中看到了一个示例,该示例概述了在 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/

相关文章:

c - C 中的数组初始化

c - mmap 与 mmap64 有什么区别吗?

c - 在链表中输入元素时进行迭代

c - 套接字C客户端未收到字符串

c++ - cmake find_library 和 CMAKE_FIND_ROOT_PATH

c - 如果用C编写的代码中的if语句无法正常工作

c - 如何使用 gcc 4.8.4 [-Wunused-parameter] 摆脱 C 中的未使用参数警告

c - 为什么我写的代码会出现段错误?

c - Dbus-API - 在 c/Linux 中获取服务链接错误?

c - 从 C 语言文件中查找最大和最小 float