c - 为什么数组大小可以访问,但动态分配的内存大小在运行时无法访问?

标签 c memory-management

如果我声明一个数组 double x[n],其中 n 是常量或 int 变量,我可以在运行时获取它的大小。但如果我使用 malloc 分配内存,则不会发生这种情况。这是因为堆栈与堆内存分配吗?如果是这样,全局变量的数组大小是如何确定的,为什么我不能将可变长度数组声明为全局变量?既然您需要知道要释放多少内存,那么释放是如何工作的?

最佳答案

基本上所有问题的答案是内存分配器私下知道它分配了多少内存,但不知道对象的类型。事实上,它可能只知道它分配了多少个固定大小的 block ,不一定与请求的字节数相同。因此,它不知道“数组”包含多少个元素,甚至不知道它是否被用作数组。

如果需要,您应该自行跟踪特定于使用情况的信息。您只需请求所需的字节数,然后根据您的选择使用该内存。分配者没有责任协助您完成此任务,这使您可以完全灵活地做任何您想做的事情。

示例中的数组x在编译时具有已知的类型和大小,或者可以在运行时推断。换句话说,编译器知道它应该根据大小值将一定数量的字节压入堆栈,并将它们用作定义类型的数组。

在全局范围内拥有 VLA 意义不大,因为 VLA 的全部意义在于,它是在进入 block 范围时根据变量大小进行分配的。全局作用域仅在程序初始化时输入一次。

关于c - 为什么数组大小可以访问,但动态分配的内存大小在运行时无法访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62868812/

相关文章:

objective-c - 点符号解除分配?

native 进程的 Java 内存使用情况

objective-c - 我必须在这里释放 OpenAL 上下文吗?

c - 生成从 1 到 limit 的所有可能的不重复整数

c - 用自身初始化变量 : how come it is not a compile-time error?

c - sscanf 不能正常工作?

c# - 显示对象引用的值

c - 请教c语言温度分析仪程序

c - strdup() 函数

c++ - Unix - 防止内存消耗失控导致 PC 崩溃?