c - 只有在进入函数时堆栈才会增长吗?

标签 c

在 C 中,可以在 block 内声明变量。这些 block 内声明的变量的空间是在进入函数时分配的(即堆栈扩展),还是稍后在进入 block 时分配?

我知道我可以通过启动调试器并查看反汇编来回答这个问题,但我想知道行为在不同平台/编译器之间是否一致,以及它是否会因优化而改变。

编辑:答案是“它是实现定义的”。似乎大多数实现确实只会在进入函数时执行此操作,动态大小数组和 alloca() 除外。有关更多详细信息,请参阅此问题的评论和已接受的答案。

最佳答案

从C编程语言的角度来看,保证的只是具有自动存储持续时间的变量(局部变量)将在程序运行时根据需要创建和销毁其内存。据我所知,它完全由实现定义是否以及何时分配和释放每个变量的内存。

在极端情况下,如果变量是可以存储在寄存器中的局部变量,则它们甚至可能无法分配内存。在那种情况下,许多不同的变量实际上可能在内存中具有相同的位置,即使从技术上讲它们都同时存在,前提是编译器可以注意到这些变量实际上不需要共存。在另一个极端,可变长度数组的空间在已知大小之前无法分配,因此除非编译器可以进行静态分析并确定数组的内存需要更早的时间,否则它可能必须推迟分配直到宣布 VLA 的地方。

希望这对您有所帮助!

关于c - 只有在进入函数时堆栈才会增长吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27992687/

相关文章:

c - 循环解析器

c - 单字符用户输入和 fgets

c - 该 C 程序可以运行,但编译会产生错误。为什么?

c - 如何在结构成员数组中应用限制指针类型关键字?

C 程序循环问题

c - C 中的隐式数字类型转换

c - C 语言的输出是什么?

c - 将数组中的文本通过管道传输到新数组中

c - 链表不打印任何内容

c - 基于 hd44780 的 LCD 与基于 P89LPC9351 的微 Controller 的接口(interface)问题