1

我将 char* 灵活的数组成员存储在一个结构中。灵活数组成员中的每个值都经过 strdup 处理。我不确定如何释放每个 strdup 的值,因为我不知道我在 char* 灵活数组成员中存储了多少元素。

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

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每次都分配商店。在这方面,它与其他两个选项没有什么不同,因为您仍然分配了额外的内存来存储标记值:

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 方法,因为其他方法依赖于算术。当然,如果您遍历数组以查找哨兵值,这将允许您确定对象计数,尽管您可以在搜索哨兵值时轻松释放事物,因此首先这样做毫无意义. :P

于 2016-01-31T01:23:57.783 回答