我注意到这种方法正常,但我不希望它:
do {
free(params);
} while ((params = params->next));
通常我会使用这样的东西,但看起来不那么优雅:
do {
params_t *next = params->next;
free(params);
params = next;
} while (params);
(代码暗示已分配params
)
或者:
while (params) {
params_t *next = params->next;
free(params);
params = next;
}
可能不相关,但我使用-std=gnu11
与clang
。
第一段代码是否有效?
答案 0 :(得分:3)
您的第一个版本不正确,在调用free()
之后依赖于内存内容的未定义行为。它可能会发挥作用,但这只是未定义的行为,可以做一些看起来很明确的事情。它真的不是。
你当然可以使用正确的循环结构,并拥有更好的生活:
for (params_t *next; params != NULL; params = next)
{
next = params->next;
free(params);
}
这似乎是比其他替代方案更好的匹配,因为您可以有用地使用for
构造的各种子句。它仍然是一个双线,但也有太简洁的代码。 :)
答案 1 :(得分:2)
此代码段
do {
free(params);
} while ((params = params->next));
具有未定义的行为,因为尝试访问不活动的对象。
此代码段
do {
params_t *next = params->next;
free(params);
params = next;
} while (params);
也是错误的(假设在循环之前没有检查params是否等于NULL),因为通常params
最初可以等于NULL。第一个代码段存在同样的问题。
仅限此代码段
while (params) {
params_t *next = params->next;
free(params);
params = next;
}
有效。:)