C:帮助理解指针

标签 c pointers hashmap

我一直在构建这个哈希表函数,它给出一个数组,它从中获取一个单词,以及一个指向它用我的链表结构填充的数组的指针。它编译正确,但我在 - *hashTable[hashVal] = *newNode; 处出现段错误.

void hashTableCreate(char *array, list *hashTable[]) {

while(arrayPos < getArrayLength(array)) {

    char *temp = getWord(array);
    int hashVal = hashingFunc(temp);
    if((*hashTable[hashVal]).word == temp ) {
        (*hashTable[hashVal]).count = (*hashTable[hashVal]).count+1;
    }
    else {
        list *newNode = malloc(sizeof(list));
        strcpy(newNode->word,temp);
        newNode->count = 1;
        *hashTable[hashVal] = *newNode;
    }
}
}

它的名字是这样的:

void timeStructures(char *newArray) {
    list *hashTable[3000];
    hashTableCreate(newArray, hashTable);
}

我知道这与我使用指针的方式有关,但我无法弄清楚。任何帮助将不胜感激。

最佳答案

这段代码有几个问题:

  1. 您似乎在将 newNode 分配给 hashTable 时使用了额外的星号。
  2. 您可以使用++运算符来增加count,并使用->来访问结构体指针的成员。<
  3. getWord 我不知道,但似乎不可能返回指向 hashTable 元素中包含的字符串的指针,这意味着下一个 if 将始终为 false(newNodeword 是复制的字符串,而不是指向 array 的 word 的指针),因为它比较内存地址而不是字符串。
  4. 您从来没有释放过 temphashTable 元素,这似乎是对您在这里所做的事情的另一个误解。
  5. 正如 @kaylum 所指出的,您应该初始化 hashTable,这样就可以避免与未分配的数组元素进行比较,也不会修改它们的 count
  6. hashTable 必须作为指向 hashTableCreate 的指针传递,否则这将在其复制版本上运行:

试试这个:

void hashTableCreate(char *array, list *(*hashTable[])) {

   while(arrayPos < getArrayLength(array)) {

      char *temp = getWord(array);
      int hashVal = hashingFunc(temp);

      if((*hashTable)[hashVal] != NULL &&
         strcmp((*hashTable)[hashVal]->word, temp) == 0 ) {
         (*hashTable)[hashVal]->count++;
      }
      else {
         list *newNode = malloc(sizeof(list));
         strcpy(newNode->word,temp);
         newNode->count = 1;
         (*hashTable)[hashVal] = newNode;
      }

      free(temp);
   }
}

void timeStructures(char *newArray) {
   list *hashTable[3000];
   int i;

   // Initialize hashTable pointers to NULL
   for(i = 0; i < 3000; i++) {
      hashTable[i] = NULL;
   }

   hashTableCreate(newArray, &hashTable);

   // Free hashTable elements, malloc'ed at hashTableCreate
   for(i = 0; i < 3000; i++) {
      if(hashTable[i] != NULL) {
         free(hashTable[i]);
      }
   }
}

注 1:你从不检查 hashVal 是否高于 3000,如果你知道自己在做什么,这可能没问题,也就是说,你知道 hashingFunc 永远不会返回3000或更高。如果不这样做,您需要适本地关注 hashTable 的增长。

注意 2:对于大型列表,在每个循环上执行 getArrayLength 可能会出现性能问题。您可能更喜欢创建一个变量来包含其值并仅执行一次。

注 3:如果将 hashTable 声明为普通的元素列表,而不是指向元素的指针列表,例如 list hashTable[3000];,但我不知道你到底在找什么。此外,它总是会浪费 3000 个 list 元素的内存,因此可能会出现性能问题。

关于C:帮助理解指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33981871/

相关文章:

java - 在 map java流列表中查找 map

通过 execv() 调用 echo 打印额外字符

c++ - C++ 中指针的行为

java - 如何读取 Firebase 实时数据库中的嵌套数据( HashMap )

c++ - 为什么要在函数指针或返回函数指针的函数编译之前放几十个*?

c - C中的外部函数修改结构体数组

javascript - 使用 JavaScript 中对象的值获取键?

c - c 中结构位值的问题

c - 使用 C 中的 strtok 解析配置中的字符串

c - C中的互斥体和线程