我是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。首先,如果您使用空字符串初始化密钥-您需要在分配给它们时释放它们,其次-在比较单元格时,请勿使用= =,因为这会检查指针是否相同,所以使用类似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/