如何释放strdup';d char*存储在结构中的灵活数组成员?
我在stuct中存储了char*灵活数组成员。灵活数组成员中的每个值都已标准化。我不确定如何释放每个标准值,因为我不知道我在char*flexible数组成员中存储了多少元素 这是我的结构与灵活的数组成员如何释放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购物中心{ 字符*名称;
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);
}