【发布时间】:2010-02-25 16:14:21
【问题描述】:
我的 HashTable 结构有以下内容:
typedef char *HashKey;
typedef int HashValue;
typedef struct sHashElement {
HashKey key;
HashValue value;
} HashElement;
typedef struct sHashTable {
HashElement *items;
float loadFactor;
} HashTable;
直到现在我才真正考虑过它,但我才意识到有两种方法可以使用它:
备选方案 1:
void hashInitialize(HashTable *table, int tabSize) {
table->items = malloc(sizeof(HashElement) * tabSize);
if(!table->items) {
perror("malloc");
exit(1);
}
table->items[0].key = "AAA";
table->items[0].value = 45;
table->items[1].key = "BBB";
table->items[1].value = 82;
table->loadFactor = (float)2 / tabSize;
}
int main(void) {
HashTable t1;
int i;
hashInitialize(&t1, HASHSIZE);
for(i = 0; i < HASHSIZE - 1; i++) {
printf("PAIR(%d): %s, %d\n", i+1, t1.items[i].key, t1.items[i].value);
}
printf("LOAD FACTOR: %.2f\n", t1.loadFactor);
return 0;
}
备选方案 2:
void hashInitialize(HashTable **table, int tabSize) {
*table = malloc(sizeof(HashTable));
if(!*table) {
perror("malloc");
exit(1);
}
(*table)->items = malloc(sizeof(HashElement) * tabSize);
if(!(*table)->items) {
perror("malloc");
exit(1);
}
(*table)->items[0].key = "AAA";
(*table)->items[0].value = 45;
(*table)->items[1].key = "BBB";
(*table)->items[1].value = 82;
(*table)->loadFactor = (float)2 / tabSize;
}
int main(void) {
HashTable *t1 = NULL;
int i;
hashInitialize(&t1, HASHSIZE);
for(i = 0; i < HASHSIZE - 1; i++) {
printf("PAIR(%d): %s, %d\n", i+1, t1->items[i].key, t1->items[i].value);
}
printf("LOAD FACTOR: %.2f\n", t1->loadFactor);
return 0;
}
问题 1: 他们似乎都产生了相同的结果。在main 上,两个示例都打印了正确的键/值对。那么,除了语法变化(使用(*table) 而不仅仅是table)、为HashTable 结构分配内存的额外代码和HashTable 指针的声明之外,它们之间究竟有什么不同?
我最近一直在编写一些数据结构,例如堆栈、链表、二叉搜索树和现在的哈希表。对于他们所有人,我一直使用替代方案 2。但现在我在想是否可以使用替代方案 1 并简化代码,删除大部分的 * 和 & .
但我问这个问题是为了了解这两种方法之间的区别,以及是否以及为什么我应该使用 on 而不是另一种。
问题 2: 如您在结构代码中所见,HashKey 是一个指针。但是,我没有使用strdup 或malloc 为该字符串分配空间。这如何以及为什么起作用?这可以吗?在处理动态字符串时,我总是在适当的地方使用malloc 或strdup,否则我会遇到很多分段错误。但是这段代码没有给我任何分段错误,我不明白为什么以及是否应该这样做。
【问题讨论】:
标签: c memory pointers hashtable structure