1

私は次のコードのようなことをしています。私はすでに一度AddtoStructFunction()充填を通過しmystructました。さて、私がやりたいのは、すべての新しいエントリをに直接追加することです。新しいキーを含む全体をmystruct解放mystructして繰り返し、g_hash_tableそれらをに挿入する必要はありませんmystruct

これを行うための良い方法は何でしょうか?新しいエントリをそれぞれ再割り当てしますか?

void InsertFunction(GHashTable *hash, char *str) {
    g_hash_table_insert(hash, str, "Richmond");
}

void AddtoStructFunction(struct dastruct **mystruct) {
    // initial fill with all elements of g_hash_table_size(g_hash_table) at the time AddtoStructFunction is called.
    mystruct = (struct dastruct **)malloc(sizeof(struct dastruct *)*g_hash_table_size(g_hash_table));
    g_hash_table_iter_init(&iter, g_hash_table);
    while (g_hash_table_iter_next(&iter, &key_, (gpointer) &val)) {
        mystruct[i] = (struct dastruct *)malloc(sizeof (struct dastruct));
        mystruct[i]->myKey = (gchar *) key_;
        i++;
    }
}

void AddExtraOnes(struct dastruct **mystruct, char *string) {
    // realloc mystruct here?
    // each time I call AddExtraOnes, I'd like to append them to mystruct
    mystruct[?]->myKey = string;
}

int i;
for(i = 0; i < 100000, i++){
    InsertFunction(g_hash_table, "RandomStrings");
}
AddtoStructFunction(mystruct);
...
// do this n times
AddExtraOnes(mystruct, "Boston");
4

1 に答える 1

1

この関数を使用してrealloc、構造体ポインターの配列を再割り当てできます。成功すると、既存のデータが新しい配列にコピーされます(mystructインスタンスへreallocのポインターが20個ある配列と、30個を含む配列がある場合、最初の20個は元の配列と同じになります)。

GLibを使用しているのでGArray、プレーンではなく検討することもできますmystruct**。それはあなたのために再割り当てを処理します。

于 2010-07-18T01:39:35.460 に答える