返回变量结构成员

Posted

技术标签:

【中文标题】返回变量结构成员【英文标题】:Return variable struct members 【发布时间】:2019-07-28 13:10:07 【问题描述】:

我需要返回一个包含两个值的结构。一个双精度值 (time) 和一个可变大小的 uint8_t 数组。我有两个函数,它们都应该返回相同类型的结构,但具有不同的数据成员 (data[9], data[64])。

我已经尝试创建一个带有额外成员 size 的结构,但这根本不起作用。 size 应该用固定长度初始化数组,但是编译器说变量大小没有定义。

typedef struct Result 
    double time;
    int size;
    uint8_t data[size];

前一个不起作用,所以我尝试创建一个空数组并在我的函数中对其进行初始化,但也不起作用。

typedef struct Result 
    double time;
    uint8_t data[];
 Result;

Result foo() 
    double time = 17.5;
    uint8_t data[9] = 0;
    Result res = sizeof(data), time, data;
    return res;


Result bar() 
    double time = 9.5;
    uint8_t data[64] = 4;
    Result res = sizeof(data), time, data;
    return res;


int main(void) 
    Result foo = foo();
    printf("%.6f\n", foo->time);
    uint8_t data[9] = foo->data;
    // work with data[9] ...

    Result bar = bar();
    printf("%.6f\n", bar->time);
    uint8_t data[64] = bar->data;
    // work with data[64] ...

我收到此错误消息:

Error: return type is an incomplete type

结构的成员应该可用,如主函数中所示。我认为编译器不知道 data 数组应该有多大,但也许有人可以解释一下这个上下文以及我关于如何返回一个包含可变大小数组的结构的问题。

如果有任何帮助,我将不胜感激,非常感谢。

【问题讨论】:

【参考方案1】:

你需要使用一个灵活的数组成员(FAM):

typedef struct Result 
    double  time;
    size_t  size;
    uint8_t data[];
;

然后您可以使用malloc() 等分配一块内存来保存数据:

uint8_t data[] = "This is the variable length payload";
struct Result *rp = malloc(sizeof(struct Result) + sizeof(data));
rp->size = sizeof(data);
strcpy(rp->data, data);
rp->time = 17.5;

return rp;

您可以安排不同数量的数据——调整大小并使用memmove()(或memcpy())进行复制。

【讨论】:

【参考方案2】:

作为结构的最后一个成员的未调整大小的数组元素称为灵活数组成员。具有这种成员的结构只能通过动态内存分配来创建,并为所需的数组大小分配足够的空间。

你可以这样做:

typedef struct Result 
    double time;
    int size;
    uint8_t data[];
 Result;

Result *foo(double time, int size) 

    Result *r = calloc(1, sizeof(Result) + size*sizeof(uint8_t));
    r->time = time;
    r->size = size;
    return r;

【讨论】:

非常感谢,这也有效。必须将另一个答案标记为解决方案,因为另一个帖子早一分钟。对不起。

以上是关于返回变量结构成员的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体函数的返回值是结构体结构体变量中的信息

quiz 3

复杂的宏的分析

结构体变量字节填充

C语言中,return语句怎么样返回一个数组?

调用对象时C ++返回对象成员变量?