首页 > 解决方案 > 内存问题中具有动态数组成员分配位置的C结构

问题描述

我想知道在这个示例程序中 foo 和 arr* 在哪里分配。foo 是在堆栈上以恒定大小分配的,还是当我在 *arr 上使用 malloc 时它会改变?如果我将 foo.arr[i] for i 从 0 更改为 4,它会改变任何东西的大小吗?foo.arr 是在堆上分配的吗?foo.arr 大小的变化会改变 foo 的大小吗?

typedef struct {
    int size;
    int* arr;
} S;

int main(void) {
    S foo;
    int new_size = 5;
    foo.size = new_size;
    foo.arr = malloc(new_size * sizeof(int));

    free(foo.arr);
    return 0;
}

标签: cmemorymemory-managementdynamic-memory-allocation

解决方案


您的困惑源于将指针与分配的空间混为一谈。简单地说,指针只是一个变量,它保存一个值,该值描述了另一个值在内存中的地址。指针所需的空间由体系结构的最大可寻址空间决定,而不是由分配的内存块决定。参考思考。

在这种情况下,foo在堆栈中分配并且结构实例的大小保持不变。malloc正在为您处理内存分配机制并将新的内存地址返回到分配的空间。随后,您将获取该内存地址并将其保存在arr成员中。

此外,在堆栈中分配的任何内容本质上都必须是固定大小的。调用函数时需要知道堆栈帧的大小。考虑这样一个事实,即过程的每个参数都必须具有已知大小或指向堆中分配的某个结构的指针。

现在,考虑到所有这些,存在声明可变大小结构的机制,但您需要注意在堆中分配结构并显式处理内存。C99 标准引入了灵活的数组成员,它允许在结构声明中放置大小未确定的数组,前提是它伴随着另一个成员,并且它被放置为结构的最后一个成员。


推荐阅读