如果我声明一个数组 double x[n]
,其中 n 是常量或 int 变量,我可以在运行时获取它的大小。但如果我使用 malloc 分配内存,则不会发生这种情况。这是因为堆栈与堆内存分配吗?如果是这样,全局变量的数组大小是如何确定的,为什么我不能将可变长度数组声明为全局变量?既然您需要知道要释放多少内存,那么释放是如何工作的?
最佳答案
基本上所有问题的答案是内存分配器私下知道它分配了多少内存,但不知道对象的类型。事实上,它可能只知道它分配了多少个固定大小的 block ,不一定与请求的字节数相同。因此,它不知道“数组”包含多少个元素,甚至不知道它是否被用作数组。
如果需要,您应该自行跟踪特定于使用情况的信息。您只需请求所需的字节数,然后根据您的选择使用该内存。分配者没有责任协助您完成此任务,这使您可以完全灵活地做任何您想做的事情。
示例中的数组x
在编译时具有已知的类型和大小,或者可以在运行时推断。换句话说,编译器知道它应该根据大小值将一定数量的字节压入堆栈,并将它们用作定义类型的数组。
在全局范围内拥有 VLA 意义不大,因为 VLA 的全部意义在于,它是在进入 block 范围时根据变量大小进行分配的。全局作用域仅在程序初始化时输入一次。
关于c - 为什么数组大小可以访问,但动态分配的内存大小在运行时无法访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62868812/