c - 将一个元素重新添加到动态数组列表中(从内存中删除后)
问题描述
我正在处理 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 语言的初学者 ^^'
解决方案
问题(至少是一个问题)是 array_list_free 释放array_list_t
对象本身,而不仅仅是内部动态数组:
free(array);
如果这本身不是问题(如果该对象不是动态分配的),那么在没有为其分配新空间并初始化该空间的情况下继续使用该对象是一个问题——无论是在该函数本身还是在那之后函数返回。
说到初始化,一个初始化函数的显着之处在于它在你所呈现的那些函数中的缺失。也许您通过普通初始化程序或默认初始化来初始化您的对象,或者您只是省略了该函数,但请注意您不能依赖未初始化的对象。
推荐阅读
- r - 统计 20 天内的病例数
- node.js - 如何在dockerfile中放置双&符号
- javascript - Javascript Object.entries()
- javascript - 使用 localstorage Redux + Next.js 加载初始状态
- javascript - 为什么 [null, undefined, []] == ",," 返回 true
- docker - 未配置 SMTP,请检查您的 grafana.ini 配置文件的 [smtp] 部分
- python-3.x - Python:只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引
- python - 有没有办法在安装过程中修复 ReadTimed out 错误?
- database - 如何计算 PostgreSQL 数据库中特定用户(和相关对象)的存储空间(以字节为单位)?
- katalon-studio - 如何将评论从katalon导出到外部文件