gpt4 book ai didi

c - 如何为 int C 哈希表分配内存?

转载 作者:行者123 更新时间:2023-11-30 16:14:16 25 4
gpt4 key购买 nike

我对 C 很陌生,对内存分配非常困惑。我正在尝试创建一个哈希表,但不知道在内存方面该怎么做,特别是对于作为字符串数组的keys参数。

我正在尝试设置代码以扫描文本文件中的单词并打印它们的频率。我阅读了一些内容,发现我可能需要使用 realloc 函数,但我不完全确定。

感谢任何帮助,谢谢!

struct htablerec {
int capacity;
int num_keys;
int *frequencies;
char **keys;
};

htable htable_new(int capacity2){
int i;
htable result = malloc(sizeof *result);
result->capacity = capacity2;
result->num_keys = 0;

result->frequencies = malloc(result->capacity * sizeof
result->frequencies[0]);

result->keys = malloc(result->capacity * sizeof(char *));

for(i=0;i<result->capacity;i++){
result->frequencies[i] = 0;
result->keys[i] = malloc(1);
result->keys[i][0] = 0;
}
return result;
}

int htable_insert(htable h, char *str){
int i;
int number = htable_word_to_int(str) % h->capacity;

for(i=0; i<h->capacity; i++){

if(number == h->capacity){
number = 0;
}

if(strlen(h->keys[number]) == 0){
h->keys[number] = str;
h->frequencies[number]++;

h->num_keys++;
return h->frequencies[number];

}
if(h->keys[number] == str){
h->frequencies[number]++;
return h->frequencies[number];
}
number++;
}
return 0;
}

最佳答案

你有几个问题,但主要的一个是处理 str,首先,如果你用空字符串初始化键 - 当你分配给它们时,你需要释放它们,第二 - 当你比较一个单元格时,不要' t 使用 ==,因为这会检查指针是否相同,请使用类似 strcmp 的东西,最后 - 当您分配时,根据程序的实现 - 您可能需要使用类似 strdup 的东西来复制 str,否则您将指向到与您获得的指针相同的空间。例如:

int htable_insert(htable h, char *str){
int i;
int number = htable_word_to_int(str) % h->capacity;

for(i=0; i<h->capacity; i++){

if(number == h->capacity){
number = 0;
}

if(strlen(h->keys[number]) == 0){
free(h->keys[number]);
h->keys[number] = strdup(str);
h->frequencies[number]++;

h->num_keys++;
return h->frequencies[number];

}
if(!strcmp(h->keys[number], str)){
h->frequencies[number]++;
return h->frequencies[number];
}
number++;
}
return 0;
}

这并不完美,它不能处理内存分配失败或参数中的空指针,更好的方法是将键初始化为 NULL 值 - 但它说明了主要问题

此外 - 尚不清楚大小是否需要保持不变,如果不需要,则需要逻辑在散列表已满时扩展散列表(检测条件、重新分配频率和键、重新分配键和频率)根据新容量,处理重新分配失败等)

关于c - 如何为 int C 哈希表分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57773497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com