我正在做哈希实现。我有以下示例程序。
#define HASHSIZE 25
struct HashTable {
char key[50];
char val[50];
};
int main() {
struct HashTable *hashtab[HASHSIZE]; // declaration - 1
struct HashTable hashtab2[HASHSIZE]; // declaration - 2
}
声明-1:
struct HashTable *hashtab[HASHSIZE];
声明-2:
struct HashTable hashtab2[HASHSIZE];
根据我的理解,两个声明似乎在分配的内存布局中都是一样的。比如,分配HASHSIZE
数组struct HashTable
和变量指向结构数组的[0]
元素。
但是,我仍然觉得有些不同,我可能无法得到它。
我想知道是否存在差异,在内存布局(OR)分配/访问方面与众不同之处。
答案 0 :(得分:2)
根据我的理解,这两个声明似乎在分配的内存布局中都是一样的。
这显然是不正确的:它们分配了大小不同的结构(在32位系统上为200字节而不是2500字节)。
我仍然觉得有些不同,我可能无法得到它。
第一个是指针数组。第二个是struct
s的数组。如果您想使用第一个数组,并将任何内容设置为key
和val
,则需要先分配struct
,例如,如下所示:
hashtab[pos] = malloc(sizeof(struct HashTable));
您还需要取消引用指针:
strcpy(hashtab[pos]->key, "hello"); // Note the -> operator
strcpy(hashtab[pos]->val, "world");
另一方面,hashtab2
的所有职位都已预先分配,不需要解除引用:
strcpy(hashtab2[pos].key, "hello"); // Using . instead of ->
strcpy(hashtab2[pos].val, "world");
答案 1 :(得分:1)
cdecl是一个有用的在线工具,可以帮助初学者习惯复杂的声明。
struct HashTable *hashtab[25];
将
的指针的数组25hashtab
声明为指向structHashTable
struct HashTable hashtab[25];
将
的数组25hashtab
声明为structHashTable
答案 2 :(得分:1)
struct HashTable *hashtab[HASHSIZE];
声明一个指向struct HashTable的指针数组。这个数组将在堆栈中。之后,您将不得不为结构本身动态分配内存,该内存将位于堆上,并且可能与其他结构分配不相邻。如果完全使用,则内存将等于指针数组的大小加上所有已分配结构的大小(在您的示例中:HASHSIZE [times] sizeof(struct HashTable *)+ HASHSIZE次[times] sizeof(struct HashTable)),但是将在堆和堆栈之间共享(堆上的大多数)。
struct HashTable hashtab2[HASHSIZE];
声明一个struct HashTable数组。数组元素是连续的并且在堆栈上。使用的内存将等于数组的大小(在您的示例中:HASHSIZE * sizeof(struct HashTable)),无论数组中使用了多少元素。
答案 3 :(得分:0)
第一个是指向HashTable
结构的指针数组 - 数组的每个元素都是HashTable
的地址。要使用它,您需要为HashTable
分配内存,然后将该内存的地址放入数组中。您需要为数组的每个元素执行此操作。
第二个是HashTable
结构数组 - 数组的每个元素都是一个实际的HashTable
结构,并且它的内存由编译器为你分配。