首页 > 解决方案 > 将一个元素重新添加到动态数组列表中(从内存中删除后)

问题描述

我正在处理 c 中的动态数组列表。当我尝试在解除分配后将一个元素重新添加到一个数组列表时,我遇到了一些问题。

结构:

typedef struct array_list{
    void** array;
    size_t size;
    size_t capacity;
}array_list_t;

自由数组法:

void* array_list_free(array_list_t* array) {
    free(array->array);
    free(array);
    array->capacity = 0;
    array->size = 0;
    array->array = NULL;
}

分配和重新分配方法:

void array_list_check_and_realloc(array_list_t* array) {
    if(!(array->capacity > array->size)) {
        if(array->capacity == 0){
            //the problem is probably here
            array->capacity++;
            array->array = realloc(array->array, sizeof(void*) * array->capacity);
        }else{
            array->capacity *= 2;
            array->array = realloc(array->array, sizeof(void*) * array->capacity);
        }
    }
}

将元素插入数组列表:

void* array_list_insert(array_list_t* array, void* element) {
    array_list_check_and_realloc(array);
    size_t i;
    for( i = array_list_size(array); i > 0; --i ) {
        array->array[i] = array->array[i-1];
    }
    array->array[i] = element;
    array->size += 1;
}

主要的:

    array_list_insert(array,8);
    array_list_free(array);
    array_list_insert(array,8); // <--- Segmentation Fault

当我尝试运行该程序时,终端没有任何错误,并且看起来工作正常。但是当我尝试使用调试器时,我可以看到分段错误,我不知道为什么(我使用 CLion IDE)对不起,我是 C 语言的初学者 ^^'

标签: clistdynamicmallocdynamic-memory-allocation

解决方案


问题(至少是一个问题)是 array_list_free 释放array_list_t对象本身,而不仅仅是内部动态数组:

    free(array);

如果这本身不是问题(如果该对象不是动态分配的),那么在没有为其分配新空间并初始化该空间的情况下继续使用该对象是一个问题——无论是在该函数本身还是在那之后函数返回。

说到初始化,一个初始化函数的显着之处在于它在你所呈现的那些函数中的缺失。也许您通过普通初始化程序或默认初始化来初始化您的对象,或者您只是省略了该函数,但请注意您不能依赖未初始化的对象。


推荐阅读