释放结构成员指向的内存

Posted

技术标签:

【中文标题】释放结构成员指向的内存【英文标题】:Freeing memory pointed by members of a struct 【发布时间】:2021-06-23 02:25:50 【问题描述】:

在我的应用程序中实现之前,我正在使用动态分配的结构数组和该结构的成员进行测试,但我对这些并不熟悉(因此进行了测试),并且在释放成员时遇到了错误每个结构。

我没有正确释放吗?还是我分配内存时的问题?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define CODE_LEN 20
#define QTY_LEN 5

typedef struct 
    char* code;
    char* qty;
    int filePos;
 ENTRY;

void malloc_ptr(ENTRY**);
void realloc_ptr(ENTRY**);

int main()

    ENTRY *ssar;
    int i;

    malloc_ptr(&ssar);

    memcpy(ssar[0].code, "abcde", 5);
    memset(ssar[0].code + 5, 0, 1);

    printf("%s\n", ssar[0].code);

    realloc_ptr(&ssar);
    memcpy(ssar[4].code, "fghij", 5);
    memset(ssar[4].code + 5, 0, 1);

    printf("%s\n", ssar[4].code);

    //Exited with code=3221226356 here
    for(i = 0;i < 5;i ++)
        free(ssar[i].code);
        free(ssar[i].qty);
    
    free(ssar);

    return 0;


void realloc_ptr(ENTRY** ssar)
    int i;

    *ssar = realloc(*ssar, 5 * sizeof(*ssar));

    for(i = 1;i < 5;i ++)
        (*ssar)[i].code = malloc(CODE_LEN * sizeof(char));
        (*ssar)[i].qty = malloc(QTY_LEN * sizeof(char));
    


void malloc_ptr(ENTRY** ssar)
    *ssar = malloc(sizeof(*ssar));
    (*ssar)[0].code = malloc(CODE_LEN * sizeof(char));
    (*ssar)[0].qty = malloc(QTY_LEN * sizeof(char));

谢谢

【问题讨论】:

仅供参考,您不应该考虑释放结构的成员或释放指针。你正在释放他们指向的内存。 你说得对,这只是语言的误用,但我想这样思考和表达会更清楚 您已经设法通过编写不必要的复杂代码来迷惑自己。首先编写一个函数,例如ENTRY* ENTRY_alloc (void);,然后删除所有指向指针的指针。一旦你完成了这项工作,你就可以开始使用指针到指针来学习了。 您不释放指针,也不释放成员。你只释放它们指向的东西。 您只需要一个包装器。 realloc(NULL, s)malloc(s) 相同。如果将指针初始化为 NULL,则始终可以使用 realloc 【参考方案1】:

例如函数malloc_ptr

void malloc_ptr(ENTRY** ssar)
    *ssar = malloc(sizeof(*ssar));
    (*ssar)[0].code = malloc(CODE_LEN * sizeof(char));
    (*ssar)[0].qty = malloc(QTY_LEN * sizeof(char));

不正确并调用未定义的行为。

在此声明中

    *ssar = malloc(sizeof(*ssar));

您需要分配一个 ENTRY 类型的对象,而不是一个指向该类型对象的指针。那就是你需要写

    *ssar = malloc( sizeof( **ssar ) );

    *ssar = malloc( sizeof( ENTRY ) );

函数realloc_ptr也存在同样的问题。而不是这种说法

*ssar = realloc(*ssar, 5 * sizeof(*ssar));

你必须写

*ssar = realloc(*ssar, 5 * sizeof(**ssar));

*ssar = realloc(*ssar, 5 * sizeof( ENTRY ));

另外最好使用中间指针,因为函数可以返回一个空指针。在这种情况下,分配内存的先前地址将丢失。例如

ENTRY *tmp = realloc(*ssar, 5 * sizeof( ENTRY ));
if ( tmp != NULL ) *ssar = tmp; 

而不是这两个语句

memcpy(ssar[0].code, "abcde", 5);
memset(ssar[0].code + 5, 0, 1);

写起来更简单

strcpy( ssar[0].code, "abcde" );

【讨论】:

谢谢!嗯..这是有道理的 另外感谢良好的编码练习技巧,我一定会使用中间指针

以上是关于释放结构成员指向的内存的主要内容,如果未能解决你的问题,请参考以下文章

C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

C 语言结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

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

局部变量可能指向释放的内存

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

释放 DeviceIoControl 分配的内存