我是C语言的初学者,在实现结构的(有序)动态数组时遇到问题。 在将元素添加到数组之前,我想检查它是否已满,并在这种情况下将其大小加倍:
void insert_translation(dict_entry **dict, char *word, char *translation){
if( dictionary_entries == dictionary_size ){
dict_entry *temp_dict;
temp_dict = realloc(&dict, (dictionary_size *= 2) * sizeof(dict_entry) );
// printf("Increased dict size to %d\n", dictionary_size);
// if(temp_dict == NULL){
// fprintf(stderr, "Out of memory during realloc()!\n");
// /*free(dict);
// exit(EXIT_OUT_OF_MEMORY);*/
// }
//free(dict);
//*dict = temp_dict;
}
dictionary_entries++;
printf("Inserted %s into dict - %d of %d filled.\n", word, dictionary_entries, dictionary_size);
}
我这样从主函数调用函数:
dictionary_size = 2; //number of initial key-value pairs (translations)
dictionary_entries = 0;
dict_entry *dictionary = malloc(dictionary_size * sizeof(dict_entry));
[...]
insert_translation(&dictionary, "bla", "blub");
据我所知,字典是指向内存空间的指针。 &dictionary是指向该函数的指针。在函数中,dict是指向指针的指针,因此&dict应该是指向内存中区域的指针吗?但是,当我尝试编译时,出现以下错误消息:
pointer being realloc'd was not allocated
我扩展了代码示例以在主函数中显示更多代码。
答案 0 :(得分:2)
问题出在这句话
drop table if exists ecodistricts_bk;
create temp table ecodistricts_bk
as(
select st_within(growingplaces_bk.geom, ecodistricts.geom),
ecodistricts.region, id
from growingplaces_bk, ecodistricts);
select *
from ecodistricts_bk ebk
where ebk.st_within = 't'
参数temp_dict = realloc(&dict, (dictionary_size *= 2) * sizeof(dict_entry) );
具有类型
dict
在重新分配内存的语句中,您必须使用指针dict_entry **dict
的值,但是您正在使用类型*dic
的表达式&dict
。
比较作业左侧的类型
dict_entry ***
具有重新分配的指针的类型。它们应该相同(除了在C中,其中一个可以具有ict_entry *temp_dict
类型)
所以你需要写
void *
在C中,参数按值传递。如果要更改参数的原始值,则应通过指向该参数的指针通过引用将其传递。在该函数中,需要取消引用指针,以更改指针指向的对象。
答案 1 :(得分:1)
&dict
-> *dict
。您可以使用返回类型来简化代码,以避免此类错误:
dict_entry* insert_translation(dict_entry* dict, char *word, char *translation)
{
...
if( dictionary_entries == dictionary_size )
{
dictionary_size *= 2;
dict_entry *tmp = realloc(dict, sizeof(dict_entry[dictionary_size]));
if(tmp == NULL)
{
// error handling, free(dict) etc
}
else
{
dict = tmp;
}
}
...
return dict;
}