【发布时间】:2018-08-25 09:46:50
【问题描述】:
我遇到了一段代码,其中 typedef 数组是由结构创建的。然后在另一个结构中使用该 typedef。
在函数中接收 typedef 并使用其中的 typedef 初始化结构时,我只获取数组中第一个元素的数据。
下面我有一个简化的例子来说明我目前所得到的。
struct simple_struct {
double a;
};
typedef struct simple_struct arr_typedef[2];
struct struct_with_typedef {
const arr_typedef typedef_arr;
};
void foo(const arr_typedef arg_s) {
struct struct_with_typedef test = {
*arg_s
};
int i;
for (i = 0; i < 2; i++) {
printf("value: %f \n", test.typedef_arr[i].a);
}
}
int main(int argc, char* argv[]) {
arr_typedef d_test = { {1}, {2} };
foo(d_test);
return 1;
}
使用 gcc 4.4 编译并运行时,我看到以下输出:
~/public > ./test
value: 1.000000
value: 0.000000
谁能解释为什么第二项的价值不可用?
如果我忽略了取消引用,我会在编译时得到以下错误,我也没有得到:
test.c:82:错误:使用类型“const struct simple_struct *”初始化类型“double”时类型不兼容
我已经删除了 typedef 并且相同的结果仍然存在。有点理解,确实给出了一个初始化器值。但是结构中只有一个成员,还是在后台展开?
如果是这样,您将如何初始化这两个值?
struct simple_struct {
double a;
};
struct struct_with_arr {
const struct simple_struct struct_arr[2];
};
void foo(const struct simple_struct arg_s[2]) {
struct struct_with_arr test = {{*arg_s}};
int i;
for (i = 0; i < 2; i++) {
printf("value: %f \n", test.struct_arr[i].a);
}
}
int main(int argc, char* argv[]) {
struct simple_struct d_test[2] = { {1}, {2} };
foo(d_test);
return 1;
}
【问题讨论】:
-
当然你只得到第一个元素,这就是
*arg_s所做的。话虽如此,将数组隐藏在 typedef 后面是非常糟糕的做法,就像将指针隐藏在 typedef 后面一样糟糕。找不到这个bug的原因,其实是因为你把数组藏在了typedef后面。 -
您只提供 1 个初始化值:
*arg_s。如果你感到困惑,没关系!不要做这样的typedef! -
谢谢,我已经根据您的 cmets 更新了问题,提供了更多信息
-
*X表示X[0]
标签: c struct typedef initializer