释放结构成员指向的内存

Freeing memory pointed by members of a struct

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

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

#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));
}

谢谢

例如函数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 ));

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

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" );