C (std=c99) 指向结构内存分配的指针

标签 c memory-management malloc c99 local-variables

<分区>

所以,这工作正常......这意味着,没有编译器错误,似乎没有内存泄漏,它正在做我想做的事。那说它应该工作吗?当我转到 books_init 时,我将一个局部变量发送到集合,这是否意味着当我返回 main 时它不应该工作? (或未定义的行为?)。另外,如果你说我必须 malloc 它,我必须在之后释放它吗? (评论清理)

/* pseudo struct Collection{
    size_t size, capacity;
    Volume *volumes;
} */

void collection_init(Collection *col, size_t capacity){
    col->size = 0;
    col->capacity = capacity;
    col->volumes = malloc(sizeof(Volume) * capacity);
}

void collection_resize(Collection *col, size_t capacity){
    Volume *v = realloc(col->volumes, capacity * sizeof(Volume));
    if(!v) return;
    col->capacity = capacity;
    col->volumes = v;
}

void collection_add(Collection *col, Volume *volume){
    if(col->size >= col->capacity)
        collection_resize(col, col->capacity * 2);
    col->volumes[col->size++] = *volume;
}

void collection_clean(Collection *col){
    //for(vol : col->vol) free(vol);
    //should I free every element or just volumes?
    free(col->volumes);
}

void books_init(Collection *col){
    for(int i = 0; i < 25; ++i){
        Volume v = {.swag = i};
        collection_add(col, &v);
    }
}    



int main(){
    Collection col;
    collection_init(&col, 10); 
    books_init(&col);
    for(int i = 0; i < col.size; ++i){
        printf("\tVol[%d].id = %d\n", i, col.volumes[i].swag);
    }
    collection_clean(&col);
    return 0;
}

谢谢你的时间

最佳答案

books_init中的这一行

Volume v = {.swag = i};

创建一个名为 v 的局部变量,其成员 swag 初始化为 i。然后将该变量的地址传递给 collection_add。这是允许的,因为 v 仍在范围内。

collection_add中的这一行

col->volumes[col->size++] = *volume;

制作Volume 结构内容的副本,并将该副本存储在collection_init 中分配的内存中。

collection_add 返回后,books_init 中的变量 v 超出范围,但这没关系,因为 v 被复制并保存在 col->volumes 指向的内存中。

程序结束时,collection_clean只需要

free(col->volumes);

从内存中删除所有 Volume 副本。

我在您的程序中看到的唯一缺陷是 realloc 失败。在那种情况下,您仍然写入 Volume 数组。这将导致缓冲区溢出和内存损坏。为避免这种情况,collection_add 函数应在执行复制之前验证 collection_resize 函数是否成功。例如,您可以在复制之前再次检查 col->capacity > col->size

TL;DR 只要 realloc 始终成功,您的代码就没问题。

关于C (std=c99) 指向结构内存分配的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34235283/

相关文章:

c - 由终端参数引起的段错误

c - free 是否会从较小的结构指针中释放较大结构指针的所有内存?

Java 增强的 For 循环 - 编辑原始数组值

c - c中的局部变量和内存

Java 接口(interface)和内存分配

具有结构工作的 C malloc(1)

CS50 pset1 贪婪挑战

c - 数组 30 x 30 程序失败

c - 释放 malloc 的结构数组时出错

c - 初始化二维数组时出现段错误