我有一个char *灵活的数组成员存储在一个stuct中。灵活数组成员中的每个值都已被删除。我不确定如何释放每个strdup的值,因为我不知道我在char * flexible数组成员中存储了多少元素。
这是我的灵活数组成员的结构;
struct Mall{
char *mallName;
char *shops[]; <--- Flexible array member which stores shop names in the mall
} Mall;
答案 0 :(得分: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
个商店。在这方面,它与其他两个选项没有什么不同,因为你仍然分配额外的内存来存储sentinel值:
void
free_shops(char **shops)
{
for (; *shops != NULL; ++shops)
free(*shops);
}
end
指针方法另一种可能更复杂的方法是跟踪添加的商店数量的变化。由于您分配了灵活的阵列成员,因此您知道在某些时候有多少商店。您需要做的就是添加char **end_shops;
成员,并在知道商店数量时为其指定my_mall->shops + shop_count
。然后,当您想要释放由strdup()
分配的字符串时:
void
free_shops(
char **shops,
char **end)
{
while (end-- != shops)
free(*end);
}
如果你没有对象计数,那么你只能在其他人依赖算术的情况下坚持使用sentinel方法。当然,如果你遍历数组来查找sentinel值,这将允许你确定对象数,虽然你可以在搜索sentinel值时轻松地释放东西,这使得首先这样做毫无意义。 :P