如何在C中释放指向结构的指针数组?

Posted

技术标签:

【中文标题】如何在C中释放指向结构的指针数组?【英文标题】:How to deallocate array of pointers to structures in C? 【发布时间】:2020-04-15 15:45:54 【问题描述】:

我需要动态分配结构数组并对其执行一些操作,然后释放内存。当我尝试像那样释放内存时

for (int i = 0; i < booksAmount; i++) 
    free(myArray[i])

这里是代码链接

https://repl.it/@Xyrolle/Structures

我需要使 printList 函数在释放后不会打印书籍数组。

另外,您对如何更有效地管理内存有什么建议吗?

谢谢。

【问题讨论】:

@chux-ReinstateMonica 现在够了吗? 【参考方案1】:

您分配内存的方法不正确。当您为每本书使用结构时。您应该为每条记录单独分配内存。因为您可能不会一次存储所有书籍记录。例如:你有最大没有。书籍数量为 100,但现在您有 10 本书的信息。使用您的方法,90 本书的内存将被浪费。

void allocList(struct Book **myArray, int booksAmount) 
        int i;
        for(i = 0;i < booksAmount; i ++) 
            *myArray = (struct Book*) malloc(sizeof(struct Book));
        

错落有致的记忆:

for (i = 0; i < booksAmount; i ++)  
    free(myArray[i]); 

【讨论】:

【参考方案2】:

代码如下所示:

struct Book *booksList = NULL;
allocList(&booksList, booksAmount);

void allocList(struct Book **myArray, int booksAmount) 
    *myArray = malloc(sizeof(struct Book) * booksAmount);
    printf("memory for %d books was allocated \n", booksAmount);

现在释放分配的内存。您为书籍数组分配了一次内存一次,因此您只需要一个free

free(booksList);

另外,请注意我从malloc 中删除了演员表。 This post 很好地说明了为什么不应该使用它。

【讨论】:

感谢您的选角建议。当我尝试像这样释放内存时,只有第一个结构的“标题”字段被释放,但其余部分仍在内存中,可以打印到屏幕上。 @SergheyHmeli - 你混淆了free内存(告诉编译器它可以重用内存)以及值是否仍然存在于该位置,因为它们尚未被覆盖。在您free 内存之后,任何访问这些值的尝试都会调用 Undefined Behavior - 您不再拥有该内存。无法保证这些地址会有什么。如果没有进一步的分配,所有原始值可能仍然存在 - 但您不能再使用该内存 - 出于这个原因 - 无法保证会存在什么。

以上是关于如何在C中释放指向结构的指针数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 C 中指向列表的指针结构数组?

怎么用new定义一个类数组,并且释放内存

c语言赋值是啥?

在C ++中初始化一个指向结构的指针数组

我应该如何释放类型映射中为 argout 结构数组分配的内存?

C:指向结构指针数组的指针(分配/解除分配问题)