如何在C中完全删除动态数组而不仅仅是单个元素

如何在C中完全删除动态数组而不仅仅是单个元素,c,C,我必须创建一个函数来删除整个动态数组,我很难思考如何处理存储的数据,因为如果我只使用free()我会丢失内存 我在其他问题上找不到任何帮助,因为他们主要讨论删除单个元素,但我想基本上销毁数组。 谢谢经验法则是每个malloc都应该有一个免费的 如果是数组,则所有数据都直接存储在数组的内存中。释放数组将释放所有元素 free(people); 例如,假设我有一个名为person的结构 typedef struct { int id; char name[20]; } person; 如

我必须创建一个函数来删除整个动态数组,我很难思考如何处理存储的数据,因为如果我只使用free()我会丢失内存

我在其他问题上找不到任何帮助,因为他们主要讨论删除单个元素,但我想基本上销毁数组。
谢谢

经验法则是每个
malloc
都应该有一个
免费的

如果是数组,则所有数据都直接存储在数组的内存中。释放数组将释放所有元素

free(people);
例如,假设我有一个名为
person
的结构

typedef struct {
  int id;
  char name[20];
} person;
如果我想存储8个结构,我会分配一个足以容纳8个结构的数组

person *people = malloc(sizeof(person) * 8);
我分配给数组的每个对象都会复制到数组中

// `p` uses automatic stack memory which is managed for you
person p = { .id = 23, .name = "Yarrow Hock" };
people[0] = p;  // p is copied to the array's heap memory
for( int i = 0; i < 8; i++ ) {
    person *p = malloc(sizeof(person));
    p->id = i;
    p->name = "Some One";
    people[i] = p;
}
完成后,我将释放阵列。这将释放所有结构

free(people);
一个malloc,一个免费


指针数组是不同的。如果我想存储一个包含8个指针的数组到我的结构,我会为8个指针分配空间

person **array = malloc(sizeof(person*) * 8);
然后我必须为每个元素分配空间。只有指针被复制到数组中

// `p` uses automatic stack memory which is managed for you
person p = { .id = 23, .name = "Yarrow Hock" };
people[0] = p;  // p is copied to the array's heap memory
for( int i = 0; i < 8; i++ ) {
    person *p = malloc(sizeof(person));
    p->id = i;
    p->name = "Some One";
    people[i] = p;
}
这取决于代码的设计方式。例如,如果我在数组中存储指向每个人姓名的指针

char *names = malloc(sizeof(char*));
for( int i = 0; i < 8; i++ ) {
    names[i] = people[i]->name;
}

// Free only the array.
free(names);
他们也需要自由。这使数组元素的内存管理变得复杂。您需要了解如何管理阵列元素的详细信息

for( int i = 0; i < 8; i++ ) {
    free(people[i]->name);
    free(people[i]);
}
free(people);

我不明白-您想如何删除数组但保留数据?我想说的是,如果我只使用free(),我会不会丢失内存并出现valgrind错误?您需要显示示例代码。如果正在分配的数组是指针数组,然后指向更多分配,然后,您必须遍历数组并释放每个分配的内存,然后才释放原始数组。否则,您不会像在任何VLA中填充0或其他表示空闲或已使用的内容一样“删除元素”。只需删除您使用
malloc
等分配的内容。如果您只调用
malloc
一次来创建数组,那么您只需要使用相同的数组调用
free
一次。如果多次调用
malloc
,一次调用一个指针数组,然后再次调用数组中的每个指针以分配它指向的对象,则反向过程:首先为数组中的每个指针调用
free
,然后为数组本身调用一次。
void free_the_people(gpointer data) {
    person *p = (person*)data;
    printf("Deallocating %s\n", p->name);
    free(p->name);
    free(p);
}

int main() {
    GPtrArray *people = g_ptr_array_new_full(8, free_the_people);

    // Allocate memory for the struct.
    person *p = malloc(sizeof(person));

    // Allocate memory for the string.
    p->name = malloc(40);
    strcpy(p->name, "Yarrow Hock");
    p->id = 23;

    // Copy the pointer to the array.
    g_ptr_array_add(people, p);

    // Call free_the_people on each element, then deallocate the array.
    g_ptr_array_unref(people);
}