使用malloc创建结构体并为其成员分配了内存,如何释放?

4
假设我有一个实现向量的 C 结构体如下所示:
```c struct Vector { int x; int y; }; ```
struct cvector {
    unsigned int size;     // indicates number of element in the vector
    unsigned int capacity; // indicates length of the array
    int* data;             // array to store the actual data
};
typedef struct cvector* cvector;

然后我像这样创建这个向量:

cvector cvector_create() {
    cvector retval = (cvector)malloc(sizeof(struct cvector));
    retval->capacity = 8;
    retval->size = 0;
    retval->data = (int*)malloc(retval->capacity * sizeof(int));

    return retval;
}

我使用 malloc 来为结构体和内部的 int 数组分配内存。

为了释放我的 cvector,我使用以下代码:

void cvector_free(cvector vector) {
    free(vector);
}

我的问题是,我是否需要单独释放内部的 int 数组,像这样:free(vector->data),还是仅释放 struct 就足够了?

1个回答

3

是的,你需要同时释放freevector->data,规则是:每次调用malloc都要对应一次free

如果你使用的是C99以下的版本,你可以使用可变长数组成员:

struct cvector {
    unsigned int size;     // indicates number of element in the vector
    unsigned int capacity; // indicates length of the array
    int data[];            // array to store the actual data
};

请注意,int data[]; 必须是 struct 的最后一个成员。 然后,您可以通过以下方式预留空间:
cvector cvector_create() {
    cvector retval = malloc(sizeof(struct cvector) + (sizeof(int) * 8));
    retval->capacity = 8;
    retval->size = 0;
    return retval;
}

现在,只需要调用free(vector)即可,因为vectorvector->data在同一个块中。

谢谢,非常感谢。但是 malloc(sizeof(struct cvector) + (sizeof(int) * 8)); 这部分让我有点困惑。编译器如何知道要为哪些结构成员分配内存?例如,当我有一个具有多个 int 数组的结构体,并且我想使用您上面介绍的方法时会发生什么? - szenadam
由于可变成员必须始终是最后一个成员,并且额外的空间(8个int)用于它。 - David Ranieri
如果我有一个名为mystruct的结构体,其中包含成员...; int data1[]; int data2[]; int data3[];,只要这三个成员是结构体成员中最后的三个,我就可以执行malloc(sizeof(mystruct) + (sizeof(int)*10) + (sizeof(int)*10) + (sizeof(int)*10))吗? - szenadam
1
@szenadam,不好意思 :) 一个struct只能有一个柔性数组成员。 - David Ranieri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接