我已經在我的哈希表結構如下:將結構初始化爲指針還是沒有區別?
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