0

私は自分のライブラリを作成していますが、ポインターの構文を理解しようと思ったときに、混乱し、Web で検索すると、さらに混乱します。

基本的にプールを作りたいのですが、実際にやりたいことは次のとおりです。

環境

次の点を尊重する必要があります。

  • オブジェクトをプールに追加すると、オブジェクトへの現在の配列のポインターが、ポインターの新しい配列 + 1 (新しいオブジェクトを含むため) に追加されます。
  • 新しい配列は、私の foo 構造の「オブジェクト」によってポイントされます。
  • 古い配列は解放されています。
  • クリーンアップ関数を呼び出すと、プール内のすべてのオブジェクトが解放されます

構造をどのように定義すればよいですか?

typedef struct {
    int n;
    (???)objects
} foo;
foo *the_pool;

プールを管理するコードは次のとおりです。

void myc_pool_init ()
{
    the_pool = (???)malloc(sizeof(???));
    the_pool->n = 0;
    the_pool->objects = NULL;
}

void myc_push_in_pool (void* object)
{
    if (object != NULL) {
        int i;
        (???)new_pointers;

        the_pool->n++;
        new_pointers = (???)malloc(sizeof(???)*the_pool->n);

        for (i = 0; i < the_pool->n - 1; ++i) {
            new_pointers[i] = (the_pool->objects)[i]; // that doesn't work (as I'm not sure how to handle it)
        }
        new_array[i] = object;

        free(the_pool->objects);
        the_pool->objects = new_array; // that must be wrong
    }
}

void myc_pool_cleanup ()
{
    int i;
    for (i = 0; i < the_pool->n; ++i)
        free((the_pool->objects)[i]); // as in myc_push_in_pool, it doesn't work
    free(the_pool->objects);
    free(the_pool);
}

注: プールに追加されるオブジェクトのタイプは事前にわからないため、すべてのポインターを処理する必要があります 。フィードバックは大歓迎です。

4

2 に答える 2

0

まず、「foo.objects の型はどうあるべきですか?」という質問には既に回答しています。質問: void *objects;、malloc は既に を返しますvoid *。構造体にも を格納する必要がsize_t item_size;あります。nおそらくまたである必要がありsize_tます。

typedef struct {
    size_t item_count;
    size_t item_size;
    void *objects;
} foo;
foo *the_pool;

自家製のループを使用することもできますが、古いアイテムを新しいスペースにコピーし、新しいアイテムを新しいスペースにコピーするには、memcpy の方が便利な方法だと思います。

a の逆参照void *は、 a に対するポインター演算と同様に制約違反であるvoid *ためnew_pointers、別の型である必要があります。適切なサイズのオブジェクトを指す型が必要です。unsigned char次のように、正しい数の配列を使用できます。

// new_pointers is a pointer to array of the_pool->item_size unsigned chars.
unsigned char (*new_pointers)[the_pool->item_size] = malloc(the_pool->item_count * sizeof *new_pointers);

// copy the old items
memcpy(new_pointers, the_pool->objects, the_pool->item_count * sizeof *new_pointers);

// copy the new items
memcpy(new_pointers + the_pool->item_count, object, sizeof *new_pointers);

free ()はmalloc() によって返されるポインタ専用であり、1 対 1 の対応が必要であることに注意してください。各 malloc() は free()d である必要があります。malloc の方法を見てください: new_pointers = malloc(sizeof(???)*the_pool->n);... 各アイテムを解放するためにループ (myc_pool_cleanup 内) が必要だと考える理由は何ですか?

realloc を使用できますが、それ以外の場合は、malloc/memcpy/free *in myc_push_in_pool* を問題なく処理しているようです。多くの人が realloc コードを書くときに混乱する傾向があります。

于 2013-03-17T15:28:27.603 に答える