返回主类时看不到整数的相同值

问题描述 投票:0回答:1

我正在为哈希表实现设计一些框架代码。在主类中,有一部分检查表中的键。它允许重复,因此它期望返回指定大小的数组,如果条目超过该大小,则使用更大的数组再次调用它。我的问题是之前声明的“ num_results”指针。

  int num_values = 1;

  valType* values = malloc(1 * sizeof(valType));

  int* num_results = NULL;

  get(ht, key, values, num_values, num_results);
  printf("num_results: %d\n", (*num_results));
  if ((*num_results) > num_values) {
    values = realloc(values, (*num_results) * sizeof(valType));
    get(ht, 0, values, num_values, num_results);
  }

  for (int i = 0; i < (*num_results); i++) {
    printf("value of %d is %d \n", i, values[i]);
  }
  free(values);

它被声明为空(大概是因为如果没有结果,那么就不会浪费内存吗?)

int get(hashtable* ht, keyType key, valType *values, int num_values, int* num_results) {
  int slot = key % sizeof(ht);

  struct node *entry = ht->entries[slot];

  if(entry == NULL){
    printf("There are no matching hashed keys");
    return -1;
  }

  // Allocate the num_results, as just a NULL pointer was passed  
  if((num_results = malloc(sizeof(int))) == NULL){
    return -1;
  }
  // Start it at 0 so that it cxan be incremented as we check
  (*num_results) = 0;


  printf("num_results: %d\n", (*num_results));

  int temp = num_values;
  while(entry != NULL){
    if(entry->key == key){
      ++(*num_results);
      if(temp != 0){
        values[num_values-temp] = entry->value;
        --temp;
      }
    }
    entry = entry->next;
  }
  printf("num_results: %d\n", (*num_results));

  return 0;
}

这是get函数,如您所见,我分配了所需的内存,将其设置为0,然后按预期增加。输出如下:

num_results: 0
num_results: 2
num_results: 73896

这使我感到困惑,因为显然2的结果来自方法的最后一行,并且最后的打印输出是在返回主菜单之后立即出现的。这是怎么回事?为什么价值在变化?

c function pointers pass-by-reference definition
1个回答
1
投票

您必须通过引用传递指针num_results。否则,该函数将处理指针的副本。

例如

int get(hashtable* ht, keyType key, valType *values, int num_values, int ** num_results) {
  // ...
  if(( *num_results = malloc(sizeof(int))) == NULL){
    return -1;
  }
  //…

一个函数调用将看起来像

  get(ht, key, values, num_values, &num_results);

实际上,我并不认为将变量num_results声明为指针并在函数中为其动态分配内存是一种好主意。我至少将其声明为unsigned int类型。

例如

unsigned int num_results = 0;

然后函数get可能看起来像

int get(hashtable* ht, keyType key, valType *values, int num_values, unsigned int *num_results) {
    //…
    *num_results = 0;
    //…

并称为

  get(ht, key, values, num_values, &num_results);

请注意而不是

int slot = key % sizeof(ht);

似乎是您的意思

int slot = key % sizeof( *ht);
© www.soinside.com 2019 - 2024. All rights reserved.