即使我使用 malloc,我也会因为 free 而出现分段错误

I get a segmentation fault because of free even though i used malloc

我正在使用 C 编写通用 ADT,但在释放元素时我一直遇到分段错误

PairResult pairClear(Pair pair)
{
    if(pair == NULL)
    {
        return PAIR_NULL_ARGUMENT;
    }
     KeyElement key=pair->key;
     DataElement data=pair->data;
     if(key)
     pair->free_key(key);//i get the Error here
     if(data)
     pair->free_data(data);
    return PAIR_SUCCESS;
}

键和数据的内存分配:

Pair pairCreate( KeyElement key, DataElement data,
                      copyDataElements copy_data,
                      freeDataElements free_data,
                      copyKeyElements copy_key,
                      freeKeyElements free_key)
{
  Pair pair = malloc(sizeof(*pair));
    if(pair == NULL)
    {
        return NULL;
    }
     pair->copy_data=copy_data;
     pair->copy_key=copy_key;
     pair->free_data=free_data;
     pair->free_data=free_key;
   KeyElement new_string_key = copy_key(key);
    DataElement new_string_data = copy_data(data);
    if((new_string_key == NULL) || (new_string_data == NULL))
    {
        pairDestroy(pair);
        return NULL;
    }
    pair->key = new_string_key;
    pair->data = new_string_data;
return pair;
}

这对毁灭

void pairDestroy(Pair pair)
{
    if(pair == NULL)
    {
        return;
    }

    #ifndef NDEBUG
          PairResult result = 
    #endif
        pairClear(pair);
    assert(result == PAIR_SUCCESS);
    free(pair);
}

这些是使用的复制函数:

static KeyElement copyKeyInt(KeyElement n) {
    if (!n) {
        return NULL;
    }
    int *copy = malloc(sizeof(*copy));
    if (!copy) {
        return NULL;
    }
    *copy = *(int *) n;
    return copy;
}
static DataElement copyDataChar(DataElement n) {
    if (!n) {
        return NULL;
    }
    char *copy = malloc(sizeof(*copy));
    if (!copy) {
        return NULL;
    }
    *copy = *(char *) n;
    return (DataElement) copy;
}

这些是使用的免费功能

static void freeInt(KeyElement n) {
    free(n);
}

static void freeChar(DataElement n) {
    free(n);
}

这里是 pair

的结构
struct Pair_t {
    KeyElement key;
    DataElement data;
    copyDataElements copy_data;
    freeDataElements free_data;
    copyKeyElements copy_key;
    freeKeyElements free_key;
};

这些是所有使用的 typedef :

typedef struct Pair_t* Pair;

typedef enum PairResult_t { 
    PAIR_SUCCESS,
    PAIR_OUT_OF_MEMORY,
    PAIR_NULL_ARGUMENT,
} PairResult;

typedef void *DataElement;
typedef void *KeyElement;
typedef DataElement(*copyDataElements)(DataElement);
typedef KeyElement(*copyKeyElements)(KeyElement);
typedef void(*freeDataElements)(DataElement);
typedef void(*freeKeyElements)(KeyElement);

和一个主要功能,以便您可以重现它

int main()
{
Pair pair;
 for (int i = 1; i < 1000; ++i) {
        char j = (char) i;
        ++j;
     pair=pairCreate(&i,&j,copyDataChar,freeChar,copyKeyInt,freeInt);
     pairDestroy(pair);
}

我为可重现的代码添加了所有可能的内容 如果需要编辑任何内容,请在评论中告诉我

Pair pairCreate(...) {
          ...
          pair->free_data = free_data;
          pair->free_data = free_key;
          //    ^^^^^^^^^           UH OH
          ...

你欠我 15 分钟的调试时间。