C 指向结构指针成员的指针

C 指向结构指针成员的指针,c,struct,C,Struct,我有一个“hash”,它是指向结构的指针。我试图得到它的成员统计数据,这也是一个指针。我以为我可以做:hash->stats,但这似乎返回了引用stats结构。“->”应该只是取消对左边变量的引用 struct statistics { unsigned long long count; ... }; struct hashtable { GHashTable * singleton; //Single Hash Table to Store Addresses

我有一个“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'
你的代码行

 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));
这将初始化您的数据。另外,在处理完数据结构后,您需要释放内存。

您的代码行

 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));

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

什么是结构m61_统计数据?@Rohan,对不起,我刚刚更新了它,它应该都是结构statistics@user994165你告诉我们的应该没问题。有件事你没有告诉我们。也许你在某个地方混淆了某些类型,包括错误的头文件等。创建一个小但100%完整的示例,包含所需的每一段代码,以便我们可以查看整个图片。从错误消息判断,编译器试图告诉您它认为
struct hashtable
stats
成员不是
struct statistics*
,而是一个普通的
struct statistics
。因此,您需要返回并查看
struct hashtable
的真正定义位置。如有必要,您可能需要查看预处理器输出(例如使用
gcc-e
)。什么是
struct m61_statistics
?@Rohan,抱歉,我刚刚更新了它,它应该都是structstatistics@user994165你告诉我们的应该没问题。有件事你没有告诉我们。也许你在某个地方混淆了某些类型,包括错误的头文件等。创建一个小但100%完整的示例,包含所需的每一段代码,以便我们可以查看整个图片。从错误消息判断,编译器试图告诉您它认为
struct hashtable
stats
成员不是
struct statistics*
,而是一个普通的
struct statistics
。因此,您需要返回并查看
struct hashtable
的真正定义位置。如有必要,您可能需要查看预处理器输出(例如,使用
gcc-e
)。为什么要转换malloc?为什么要转换malloc?