我将 char* 灵活的数组成员存储在一个结构中。灵活数组成员中的每个值都经过 strdup 处理。我不确定如何释放每个 strdup 的值,因为我不知道我在 char* 灵活数组成员中存储了多少元素。
这是我的带有灵活数组成员的结构;
struct Mall{
char *mallName;
char *shops[]; <--- Flexible array member which stores shop names in the mall
} Mall;
我将 char* 灵活的数组成员存储在一个结构中。灵活数组成员中的每个值都经过 strdup 处理。我不确定如何释放每个 strdup 的值,因为我不知道我在 char* 灵活数组成员中存储了多少元素。
这是我的带有灵活数组成员的结构;
struct Mall{
char *mallName;
char *shops[]; <--- Flexible array member which stores shop names in the mall
} Mall;
由于您为灵活数组成员分配空间,因此您必须知道某个时间点的商店数量。这允许您从多个选项中进行选择。下面提出的想法都是假设您传递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