自从我做了C以来已经很长时间了(25年)所以我忘记了一些事情所以请原谅这个问题。
鉴于我有以下声明:
typedef struct item {
int field;
} Item;
typedef struct data {
Item b;
} Data;
我一直在尝试在传递给函数时更新结构,而这根本不起作用。
static void foo(Data *data) {
data->b.field = 3; // doesn't work, the struct remains unchanged.
}
static void test() {
Data v = {.b = {.field = 2}};
foo(&v);
}
但是,如果我稍微改变声明,使用malloc来分配它就可以了。
typedef struct data {
Item *b;
};
static void foo(struct data *data) {
data->b->field = 3; // works.
}
static void test() {
Data v = (struct data*) malloc(sizeof(Data));
Item i = (struct item*) malloc(sizeof(Item));
foo(v);
free(i);
free(v);
}
有人可以告诉我这是为什么吗?是否不可能将可更新的结构成员作为成员?我怎么能让第一个例子起作用?
提前致谢。
答案 0 :(得分:6)
你的第一种方法确实有效(如果没有,我会感到惊讶):
v.b.field before calling foo: 2
v.b.field afterwards: 3
输出:
malloc
您的设置可能与您在代码中显示的设置不同。如果在一个对象的生命周期结束后访问它,通常会发生神秘的事情(即未定义的行为)。 typedef
经常会阻止这样的问题,因为它会使对象保持活动状态,直到它被明确释放。
但在你的情况下,应该没有任何区别。
BTW:struct
没有意义,因为你没有为刚刚声明的struct item {
int field;
};
类型定义别名。所以
{{1}}
就足够了。