【发布时间】:2015-04-03 10:24:59
【问题描述】:
为什么编译器不知道 C 中动态变量的地址(例如动态数组)?
是不是因为程序编译前没有声明变量(数组)的大小?
或者,我想,一个更好的问题是:编译器在编译程序时如何分配静态变量(或数组)的地址?
【问题讨论】:
-
静态和全局变量由编译器在编译时在数据段中生成;未初始化的被放入称为“bss 段”的数据段的一部分,该段用零填充。在运行时分配的变量是堆栈和堆变量。它们的位置取决于创建它们时的内存布局。
-
什么是“动态数组”?
-
好吧,从我在讲座中被告知的内容来看,就是当一个地址被声明为 ex int *b 然后你在主函数中调用 *b = malloc(4*sizeof(int)) ,那么这将创建一个大小为 4 的数组。
-
@PeterChung 我认为您的演讲称其为“动态数组”对您没有任何帮助。名称是“堆变量”。正在发生的事情是,当进程启动时,它在其地址空间中被赋予了一个称为“堆”的区域。 C 库具有函数(malloc、free 和friends),可让您从该区域保留内存供您使用。它从低地址向上增长,所以当你调用“malloc”时,它交还给你的内存取决于运行时堆的样子。编译器无法知道它。
标签: c arrays dynamic static compilation