我有“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'
答案 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));
这将初始化您的数据。此外,在完成数据结构后,您需要释放内存。