释放无关数据时出现段故障

时间:2018-11-03 03:20:38

标签: c segmentation-fault free dynamic-memory-allocation

我正在创建一个带有链表的表,在将数据传递给插入方法时,这些表将被复制。 为了测试这一点,我使用将要插入的值创建一个数组,然后将它们插入表中。当我释放数组然后释放表时,我收到SEG FAULT错误。因此,我得出的结论是,两种结构中的指针都必须指向相同的内存区域。但是,当我复制数据时,我看不到问题可能出在哪里……

以下是测试代码:

for(i=0; i<1024; i++) {
    key[i] = (char*)malloc(16*sizeof(char));
    sprintf(key[i],"a/key/b-%d",i);
    data[i] = data_create2(strlen(key[i])+1,strdup(key[i]));

    table_put(table,key[i],data[i]);
}

assert(table_size(table) == 1024);
result = (table_size(table) == 1024);

for(i=0; i<1024; i++) {
    d = table_get(table,key[i]);

    assert(d->datasize == data[i]->datasize);
    assert(memcmp(d->data,data[i]->data,d->datasize) == 0);
    assert(d->data != data[i]->data);

    result = result && (d->datasize == data[i]->datasize && 
                       memcmp(d->data,data[i]->data,d->datasize) == 0 &&
                       d->data != data[i]->data);
    data_destroy(d);
}

for(i=0; i<1024; i++) {
    free(key[i]);
    //data_destroy(data[i]);
}

table_destroy(table);

当我取消注释data_destroy(data [i])行时,程序将给出Seg Fault。

table_put的代码:

int table_put(struct table_t *table, char * key, struct data_t *value) {


if(table == NULL || key == NULL || value == NULL) return -1;



struct entry_t *new_pair = entry_create(key, value);



int i = key_hash(key, table->size);

int l = 0;
if (list_get(table->list[i], new_pair->key) == NULL) {
    l = 1;
}   

if(list_add(table->list[i], new_pair)==-1){

    entry_destroy(new_pair);
    return -1;
} 
table -> length = table -> length + l;

return 0;

}

以下代码:entry_create,我在其中复制数据:

struct entry_t *entry_create(char *key, struct data_t *data){
if(data == NULL || key == NULL){
    return NULL;
}
struct entry_t *entry = (struct entry_t *) malloc(sizeof(struct entry_t));
if(entry == NULL){
    return NULL;
}
entry->key = (char*) malloc(sizeof(strlen(key))+1);

memcpy(entry->key,key,strlen(key)+1);


entry->value = data_dup(data);


//free(key);
data_destroy(data);
return entry;
}

1 个答案:

答案 0 :(得分:0)

segfaults在free上通常是double free,意味着您已经尝试释放已经被freed的东西。或者当您尝试释放没有任何malloc的指针时。 data_create2函数上有任何malloc吗?

如果没有,您尝试释放从未分配过的数据数组成员