柔軟な配列メンバーにスペースを割り当てるため、ある時点でショップの数を知る必要があります。これにより、複数のオプションから選択できます。以下に示すアイデアはすべて、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