0

構造体へのポインタである「ハッシュ」があります。ポインターでもあるメンバー統計を取得しようとしています。私はただできると思っていました: 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'
4

1 に答える 1

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

これにより、データが初期化されます。さらに、データ構造の処理が完了したら、メモリを解放する必要があります。

于 2012-09-24T06:38:11.777 に答える