gpt4 book ai didi

c - 结构体中的结构体数组 typedef 显示不完整的数据

转载 作者:行者123 更新时间:2023-12-04 12:14:38 25 4
gpt4 key购买 nike

我在使用由结构体创建 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: error: incompatible types when initializing type 'double' using type 'const struct simple_struct *'


我已经删除了 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;
}

最佳答案

在此声明中

struct struct_with_typedef test = {
*arg_s
};

使用struct simple_struct类型的对象来初始化const arr_typedef类型的数组。

首先,您需要将初始化器括在大括号中,并为数组的第二个元素添加初始化器(如果您愿意的话)。

初始化数组的正确方法如下

#include <stdio.h>

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[0], arg_s[1] }
};

for ( int i = 0; i < 2; i++ )
{
printf("value: %f \n", test.typedef_arr[i].a);
}
}

int main( void )
{
arr_typedef d_test = { {1}, {2} };
foo(d_test);

return 0;
}

程序输出为

value: 1.000000 
value: 2.000000

您也可以通过以下方式编写初始化程序

struct struct_with_typedef test = 
{
{ *arg_s, *( arg_s + 1 ) }
};

请考虑用作初始值设定项表达式的数组指示符会隐式转换为指向其第一个元素的指针。取消引用指针,您将获得第一个元素本身。

关于c - 结构体中的结构体数组 typedef 显示不完整的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49318824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com