将指针传递给指针以在函数中进行重新分配

时间:2019-06-04 10:33:23

标签: c pointers parameters reference arguments

我是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

编辑

我扩展了代码示例以在主函数中显示更多代码。

2 个答案:

答案 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;
}