我了解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的反馈修正了代码答案 0 :(得分:2)
你所拥有的将会很好。如果您有多层深度的结构来缩写您所指的内容并使您的代码更清晰,那么它将特别有用。
你遇到的一个问题是内存泄漏。您可以动态地将内存分配给foo
,但是然后用另一个变量的地址覆盖该分配的内存的地址:
foo = &foos[i];
现在分配的内存丢失了。
因为您使用指针指向现有变量,所以根本不需要动态分配。摆脱malloc
和free
。
答案 1 :(得分:2)
您的计划不正确。以下是修复方法:删除RHS上的malloc
,将其替换为NULL
,然后移除free
行。
你只是移动指针,所以不需要手动分配,如果你free
最后一个值,那就是一个bug,因为你free
某些东西不是malloc
编