C:do-while释放链表

时间:2016-03-09 13:16:40

标签: c loops pointers free

我注意到这种方法正常,但我不希望它:

  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=gnu11clang

第一段代码是否有效?

2 个答案:

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

有效。:)