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

时间:2016-01-30 23:46:46

标签: c free strdup flexible-array-member

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

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

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

1 个答案:

答案 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]);
}

sentinel(终止值)方法

您还可以使用标记值(例如空指针)作为额外成员,因此您每次都要分配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