struct中的struct array typedef显示不完整的数据

时间:2018-03-16 10:44:33

标签: c struct typedef initializer

我遇到了一段代码,其中一个typedef数组是由struct创建的。然后在另一个结构中使用该typedef 当在函数中接收typedef并使用typedef初始化struct时,我只获取数组中第一个元素的数据。

下面我简要介绍了我目前所获得的内容。

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;
}

2 个答案:

答案 0 :(得分:4)

在此声明中

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 ) }
};

考虑到用作初始化表达式的数组指示符被隐式转换为指向其第一个元素的指针。取消引用指针,您将获得第一个元素。

答案 1 :(得分:1)

C中没有用于初始化数组的语法,其中一个初始值设定项表示另一个要复制值的数组。

要修复代码,您可以执行以下选项之一:

  1. 列出成员:struct struct_with_arr test = {{arg_s[0], arg_s[1]}};
  2. 将功能更改为接受struct struct_with_arr作为参数类型,在这种情况下,您可以使用struct struct_with_arr test = arg;
  3. 没有初始值设定项进行复制:struct struct_with_arr test; memcpy(&test.struct_arr, arg_s, sizeof test.struct_arr);。 (实际上你不能使用这个选项,因为你已经将struct元素定义为const ......在我看来,首先不是一个好主意)
  4. 为了完整起见,我将提及代码:

    struct struct_with_arr foo = *(struct struct_with_arr *)arg_s;
    

    这是技术上未定义的行为之一(如果参数源实际上不是struct_with_arr),但可能适用于任何存在的实际编译器。我的建议是不要这样做。