我已经在我的哈希表结构如下:将结构初始化为指针还是没有区别?
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并简化代码,去除大部分全部都在使用的*
和&
。
但我在问这个问题,以了解两种方法之间的差异,以及如果以及为什么,我应该使用另一种方法。
问题2:正如你可以在结构代码中看到,HashKey
是一个指针。但是,我没有使用strdup
和malloc
为该字符串分配空间。这是如何和为什么这样工作?这可以吗?在处理动态字符串时,我总是在适当的地方使用malloc
或strdup
,否则我会得到很多分段错误。但是这段代码并没有给我任何分段错误,我不明白为什么,如果我应该这样做。
不完全正确。局部变量不是'malloc''。他们的内存取自堆栈。 – 2010-02-25 16:26:03