3

malloc関数にスペースを割り当てるための引数として何を使用する必要があるのか​​正確にはわかりませんtable_allocate(int)。私はちょうど考えcount_table* cTable = malloc(sizeof(count_table*))ていましたが、それはサイズパラメータでは何もしません。私list_node_tもスペースを割り当てることになっていますか?以下は私が取り組んでいるものです。

.hファイルでは、次の署名が与えられています。

//create a count table struct and allocate space for it                         
//return it as a pointer                                                        
count_table_t* table_allocate(int);

これが私が使用することになっている構造体です:

typedef struct list_node list_node_t;

struct list_node {
  char *key;
  int value;

  //the next node in the list                                                   
  list_node_t *next;
};

typedef struct count_table count_table_t;

struct count_table {
  int size;
  //an array of list_node pointers                                              
  list_node_t **list_array;
};
4

4 に答える 4

8
count_table * cTable = malloc(sizeof(count_table *))

間違っている。そのはず

count_table* cTable = malloc(sizeof(count_table));

また、list_node_tにも個別にメモリを割り当てる必要があります。

編集:

char *keyクリフォードがリストノードにメモリを割り当てることについて指摘したこととは別に、メモリの割り当てはリストノードの内部にも注意を払う必要があると思います。

于 2010-11-23T02:40:35.147 に答える
2

あなたの提案:count_tableへのポインタcount_table* cTable = malloc(sizeof(count_table*))にのみスペースを割り当てます。

あなたが必要だろう

count_table* cTable = malloc(sizeof(count_table) ) ;

各リストノードは個別に割り当てられ、cTable->sizeとcTable->list_arrayが割り当てられ、list_node_t::nextそれに応じて最後に更新されます。最後に追加されたノードへのポインタを維持すると、ノードの追加が速くなります。

なぜが単なるではなく (そして単にではなく同じように呼ばれる)count_table::list_arrayタイプであるのかわかりません。それが同時に配列とリストの両方であるというのはあなたの意図ですか?それはやや冗長になります。メンバーは最初のノードへのポインタである必要があり、後続のノードは次の方法でアクセスされます。list_node_t**list_node_t*list_arraylistlist_node::next

于 2010-11-23T02:41:14.777 に答える
2

intが作成されたの「サイズ」パラメータであることを考えるとcount_table_t、それ自体を割り当てるcount_table_tだけでなく、そのメンバーを初期化することになっているようです。

メンバーの初期化にlist_arrayはメモリ割り当ても含まれるため、次のようになります。

count_table_t *table_allocate(int size)
{
    count_table_t *table = malloc(sizeof *table);
    int i;

    table->size = size;
    table->list_array = malloc(size * sizeof table->list_array[0]);
    for (i = 0; i < size; i++)
        table->list_array[i] = NULL;

    return table;
}

ただし、いくつかのエラー条件もチェックする必要があります。by の乗算がオーバーフローし、いずれかのsize呼び出しが失敗する可能性があります。したがって、関数は実際には次のようになります。sizeof table->list_array[0]malloc()

count_table_t *table_allocate(int size)
{
    count_table_t *table;
    int i;

    /* Check for overflow in list allocation size */
    if (size < 0 || size > (size_t)-1 / sizeof table->list_array[0])
        return NULL;

    table = malloc(sizeof *table);

    if (table == NULL)
        return NULL;

    table->size = size;
    table->list_array = malloc(size * sizeof table->list_array[0]);

    if (table->list_array == NULL) {
        free(table);
        return NULL;
    }

    for (i = 0; i < size; i++)
        table->list_array[i] = NULL;

    return table;
}

(は、パラメータの型であるa の最大値に(size_t)-1等しい定数であることに注意してください to )。size_tmalloc()

于 2010-11-23T05:00:40.687 に答える
1

必要なデータが占有するスペースではなく、ポインターに十分なスペースを割り当てているだけだと指摘する他のポスターに加えて、次のようなことを行うことを強くお勧めします。

count_table* cTable = malloc(sizeof(*cTable));

これは、タイプが変更された場合に役立ちますcTable。その行に 2 つの部分を調整する必要はなく、タイプだけを調整する必要があります。

于 2010-11-23T02:55:11.790 に答える