-3

編集 - 以前に投稿されたコードは、コンパイルされないため、問題になりました

構造体ハックの次のバリアントがあるとします。

typedef struct hack *Hack;
struct hack {
    char* value;
    Hack arr[1];
};

正確に何をmallocする必要がありますか?私は次のようなことをすべきですか:

malloc(sizeof(struct hack) + sizeof(struct hack)*(numElems-1));

これは次のように短縮できます。

malloc(sizeof(struct hack) * numElems);

あれは正しいですか?

4

1 に答える 1

1

最初のコードは正しくないと思います。「不完全要素型」です

typedef struct hack Hack;
struct hack {
    char* value;
    Hack arr[1];
};

に等しい:

struct hack {
    char* value;
    struct hack arr[1];  /* Here wrong */
};

間違った時点で の配列を定義しようとしましたstruct hack、の定義はまだ完了していません。ああ、あなたはそれを変更します。struct hack

新しいコードの場合、次のようになります。

typedef struct hack *Hack;
struct hack {
    char* value;
    Hack arr;
};
Hack node = malloc(sizeof(struct hack));
node->arr = malloc(sizeof(struct hack) * numElems);

この場合、「ノード」は単一の構造ハックへのポインタです。そして、このエンティティのメンバー「arr」は、構造ハックの配列へのもう 1 つのポイントです。それ以外の場合は、データを典型的な連結リストとして構築できます。

更新:ノード内のすべての値が初期化されていないことに注意(node->arr)[i]してください! memset()の直後にそれらをすべてゼロにする必要がありますmalloc()。または、使用する前に有効な値を割り当ててください。有効な値を代入する前に使用すると、セグメンテーション違反に対応するのが最善です。最悪の場合、どこが間違っているかを見つけるのに何日もかかります。

于 2013-04-03T21:01:36.013 に答える