指向Struct指针成员的指针

时间:2012-09-24 05:46:46

标签: c struct

我有“hash”,它是指向结构的指针。我试图得到它的成员统计数据,这也是一个指针。我以为我可以做:hash-> stats但似乎返回引用stats结构。 “ - >”应该只取消引用左边的变量吗?

struct statistics {
    unsigned long long count;   
   ...
};

struct hashtable {
    GHashTable * singleton; //Single Hash Table to Store Addresses
    struct statistics *stats;   //Statistics Table
};

    GHashTable *ghash = g_hash_table_new(NULL, NULL);
    struct hashtable *hash = (struct hashtable *) malloc(sizeof(struct hashtable));

//Works but why isn't hash->stats ok?
    memset(&hash->stats, 0, sizeof(struct statistics));

如果我在这一点上尝试这个:

struct statistics *st = hash->stats;

我明白了:

incompatible types when initializing type 'struct statistics *' using type 'struct 
     statistics'

1 个答案:

答案 0 :(得分:3)

您的代码行

 memset(&hash->stats, 0, sizeof(struct statistics));

是完全错误的。 hash->stats是一个指针。它的大小是32或64位。当你拿到它的地址时,就像&hash->stats一样,结果是一个指向结构的地址,非常接近它的结尾。

memset的调用会清除指针字段本身及其后的内存,即结构后面的内存。你破坏了堆中的一些内存。这将导致未定义的行为或崩溃。你应该写一些类似的东西:

   struct hashtable *hash = (struct hashtable*)malloc(sizeof(struct hashtable));
   struct statistics *stts = (struct statistics*)malloc(sizeof(struct statistics));

   hash->stats = stts;
   memset(hash->stats, 0, sizeof(struct statistics));

这将初始化您的数据。此外,在完成数据结构后,您需要释放内存。