【问题标题】:Pointer to Struct pointer member指向结构指针成员的指针
【发布时间】:2023-03-12 05:57:01
【问题描述】:

我有“哈希”,它是一个结构的指针。我正在尝试获取它的成员统计信息,这也是一个指针。我以为我可以这样做: hash->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'

【问题讨论】:

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

标签: c struct


【解决方案1】:

你的代码行

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

这将初始化您的数据。另外,当您完成数据结构时,您需要释放内存。

【讨论】:

  • 你为什么要投射 malloc?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多