为什么这只打印最后一个字?

时间:2012-05-05 17:36:09

标签: c pointers structure

我很难调试这个。当我尝试打印结构时,我只能得到最后一个字。我是在写记忆还是什么?有人能帮助我吗?

typedef struct hash_table_ {
  void **order;
  int *number_next_calls;
  int *number_buckets;
  int *buckets_size;
  int *worst;
  int *total;
  float *average;
  int (*hash_func)(char *);
  data_el **buckets_array;
} hash_table, *Phash_table;

typedef struct data_{
  char *key;
  void *data;
  struct data_ *next;
}data_el;

main(){

while ((c = getchar()) != EOF) {
    if ((c == ' ') || (c == ',') || (c == '.') || (c == '!') || (c == '"') ||
        (c == ':') || (c == '\n')) {

      /* End of a word */
      if (char_index) {
        /* Word is not empty */
        word[char_index] = '\0';
        lower_case_word(word);
        if(!find_hash(dictionary,word) ){
          insert_hash(dictionary,word,frequency[hash_function(word)]);
        }
        printf("%s\n", dictionary -> buckets_array[hash_function(word)] -> key);
        printf("%d \n",hash_function(word));
        frequency[hash_function(word)]++;
        char_index = 0;
        num_words++;
      }
    }else{
      word[char_index++] = c;
    }
  }

/*This is when it prints*/
  printf("%s\n", dictionary -> buckets_array[337] -> key);
  printf("%s\n", dictionary -> buckets_array[532] -> key);
  printf("%s\n", dictionary -> buckets_array[93] -> key);

 }

 int hash_function(char *word){

  int sum,i;
  i = 0;
  sum = 0;
  while(word[i] != '\0'){
    sum = sum + word[i];
    i++;
  }
  return sum%1000;
}

void insert_hash(Phash_table table, char *key, void *data){
  int index;
  data_el *p, *cur;

  index = table -> hash_func(key);

  /*Head insertion*/
  if(table -> buckets_array[index] == NULL){
    table -> buckets_array[index] = (data_el *)malloc(sizeof(data_el));
    table -> buckets_array[index] -> data = data;
    table -> buckets_array[index] -> next =  NULL;
    table -> buckets_array[index] -> key = key;
  }else{
    printf("%s",table -> buckets_array[index] -> key);
    cur = table -> buckets_array[index];
    p = (data_el *)malloc(sizeof(data_el));
    p -> key = key;
    p -> data = data;
    p -> next = cur;
    cur = p;
    /*
    table -> buckets_array[index] = cur;
    */
  }
}

1 个答案:

答案 0 :(得分:1)

insert_hash你有

table -> buckets_array[index] -> key = key;

RESP

p -> key = key;

也就是说,您让bucket入口指向从main传递的内存。代码是不完整的,所以我不能确定,但​​我敢打赌,main你重用word数组,并且在每次插入后都不会分配新数组。所以table->buckets_array[index]->key指向的字符串的内容会被覆盖。

您必须将字符串复制到新的内存块,并让存储桶条目指向该字符串。