1

私は char* 柔軟な配列メンバーをスタクト内に格納しています。柔軟な配列メンバー内の各値は、strdup されています。char* フレキシブル配列メンバーに格納した要素の数が正確にわからないため、strdup された各値を解放する方法がわかりません。

これは、柔軟な配列メンバーを持つ私の構造体です。

struct Mall{
    char *mallName;
    char *shops[];   <--- Flexible array member which stores shop names in the mall
} Mall;
4

1 に答える 1

1

柔軟な配列メンバーにスペースを割り当てるため、ある時点でショップの数を知る必要があります。これにより、複数のオプションから選択できます。以下に示すアイデアはすべて、shops配列自体と、該当する場合は前述の追加アイテムを渡すことを前提とした関数です。

object_count方法_

size_t shop_count;追加されたショップの数を追跡できます (構造定義に何かを追加します)。文字列の解放は次のように簡単です。

void
free_shops(
    char **shops,
    size_t n)
{
    while (n-- > 0)
        free(my_mall->shops[n]);
}

センチネル (終了値) メソッド

センチネル値 (ヌル ポインターなど) を追加のメンバーとして使用することもできるため、shop_count + 1毎回ショップを割り当てることになります。その点では、センチネル値を格納するために余分なメモリを割り当てているため、他の 2 つのオプションと違いはありません。

void
free_shops(char **shops)
{
    for (; *shops != NULL; ++shops)
        free(*shops);
}

ポインタend

もう 1 つの、おそらくより複雑な方法は、追加されたショップの数を追跡するバリエーションです。柔軟な配列メンバーを割り当てたので、ある時点でいくつのショップがあるかがわかります。あなたがする必要があるのは、メンバーを追加して、店舗数がわかっているときはいつでもそれchar **end_shops;に割り当てることだけです. my_mall->shops + shop_count次に、によって割り当てられた文字列を解放する場合strdup():

void
free_shops(
    char **shops,
    char **end)
{
    while (end-- != shops)
        free(*end);
}

オブジェクト数が無かった場合、他の方法は算術に依存しているため、番兵法だけに固執することになります。もちろん、配列を繰り返し処理してセンチネル値を見つければ、オブジェクト数を特定できますが、センチネル値を検索している間に物を簡単に解放できるため、そもそもそうすることは無意味です。 . :P

于 2016-01-31T01:23:57.783 に答える