别名结构的成语

时间:2017-11-16 02:08:30

标签: c pointers struct

我了解C(主要)调用并按值分配,而struct作业a = b会创建b的副本。

当迭代成员为struct的数组并访问成员字段(下面的示例)时,这会导致一些冗长。在循环中是否存在别名结构的习惯用法?

#include <stdio.h>
#define N_FOOS 2

struct Foo {
  char *bar;
  char *baz;
};

int main() {
  struct Foo foos[N_FOOS] = {
    {"foo", "bar"},
    {"baz", "qux"},
  };

  for (int i = 0; i < N_FOOS; ++i) {
    printf("foos[%d].bar = %s\n", i, foos[i].bar);
    printf("foos[%d].baz = %s\n", i, foos[i].baz);
  }
}

在更高级别的语言中,我会在for中创建一个别名,指向foos[i]并避免重复索引。

惯用的方法是创建一个引用foos[i]的指针吗?

int main() {
  struct Foo *foo;
  struct Foo foos[N_FOOS] = {
    {"foo", "bar"},
    {"baz", "qux"},
  };

  for (int i = 0; i < N_FOOS; ++i) {
    foo = &foos[i];
    printf("foos[%d].bar = %s\n", i, foos[i].bar);
    printf("foos[%d].baz = %s\n", i, foos[i].baz);
    printf("foo->bar = %s\n", foo->bar);
    printf("foo->baz = %s\n", foo->baz);
  }
}

缺点是不得不进行手动释放,但我想这只是语言中不可避免的一部分。

编辑:由于@ dbush的反馈修正了代码

2 个答案:

答案 0 :(得分:2)

你所拥有的将会很好。如果您有多层深度的结构来缩写您所指的内容并使您的代码更清晰,那么它将特别有用。

你遇到的一个问题是内存泄漏。您可以动态地将内存分配给foo,但是然后用另一个变量的地址覆盖该分配的内存的地址:

foo = &foos[i];

现在分配的内存丢失了。

因为您使用指针指向现有变量,所以根本不需要动态分配。摆脱mallocfree

答案 1 :(得分:2)

您的计划不正确。以下是修复方法:删除RHS上的malloc,将其替换为NULL,然后移除free行。

你只是移动指针,所以不需要手动分配,如果你free最后一个值,那就是一个bug,因为你free某些东西不是malloc