两个结构变量声明之间的区别?

时间:2017-03-31 14:19:17

标签: c struct

我正在做哈希实现。我有以下示例程序。

#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)分配/访问方面与众不同之处。

4 个答案:

答案 0 :(得分:2)

  

根据我的理解,这两个声明似乎在分配的内存布局中都是一样的。

这显然是不正确的:它们分配了大小不同的结构(在32位系统上为200字节而不是2500字节)。

  

我仍然觉得有些不同,我可能无法得到它。

第一个是指针数组。第二个是struct s的数组。如果您想使用第一个数组,并将任何内容设置为keyval,则需要先分配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];
  

hashtab声明为指向struct HashTable

的指针的数组25
struct HashTable hashtab[25];
  

hashtab声明为struct HashTable

的数组25

答案 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结构,并且它的内存由编译器为你分配。