如何释放strdup';d char*存储在结构中的灵活数组成员?

如何释放strdup';d char*存储在结构中的灵活数组成员?,c,free,strdup,flexible-array-member,C,Free,Strdup,Flexible Array Member,我在stuct中存储了char*灵活数组成员。灵活数组成员中的每个值都已标准化。我不确定如何释放每个标准值,因为我不知道我在char*flexible数组成员中存储了多少元素 这是我的结构与灵活的数组成员 struct Mall{ char *mallName; char *shops[]; <--- Flexible array member which stores shop names in the mall } Mall; struct购物中心{ 字符*名称;

我在stuct中存储了char*灵活数组成员。灵活数组成员中的每个值都已标准化。我不确定如何释放每个标准值,因为我不知道我在char*flexible数组成员中存储了多少元素

这是我的结构与灵活的数组成员

struct Mall{
    char *mallName;
    char *shops[];   <--- Flexible array member which stores shop names in the mall
} Mall;
struct购物中心{
字符*名称;

char*shops[];由于您为灵活数组成员分配了空间,因此您必须知道某个时刻的店铺数量。这允许您从多个选项中进行选择。下面介绍的想法都是假设您通过
店铺
数组本身和所提到的额外项目(如果适用)的函数:

对象计数
方法 您可以跟踪添加的店铺数量(将类似
size\t shop\u count;
的内容添加到结构定义中)。释放字符串非常简单:

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

sentinel(终止值)方法 您还可以使用sentinel值(例如空指针)作为额外成员,因此每次都要分配
shop\u count+1
shops。在这方面,它与其他两个选项没有什么不同,因为您仍然分配额外的内存位来存储sentinel值:

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

end
指针方法 另一种可能更复杂的方法是跟踪添加的店铺数量。由于您分配了灵活的数组成员,因此您知道在某一点上有多少家店铺。您所需要做的就是添加一个
char**end_shops;
成员,并在知道店铺数量时将
my_mall->shops+shop_count
分配给它。然后,当您要释放由
strdup()分配的字符串时:



如果您没有对象计数,您将只能使用sentinel方法,因为其他方法依赖于算术。当然,如果您迭代数组以查找sentinel值,这将允许您确定对象计数,尽管您可以在搜索sentinel值的同时轻松释放对象,这使得搜索没有意义首先要这样做。:P

您应该在数组末尾添加一个空指针。然后您可以对它进行迭代,直到找到一个空指针value@loginn它不应该已经自动有一个空指针吗?如果你自己没有添加一个空指针的话no@loginn有没有其他方法可以在不使数组结尾为空的情况下执行此操作d以了解数组的大小或在末尾有一个特殊值
void
free_shops(
    char **shops,
    char **end)
{
    while (end-- != shops)
        free(*end);
}