C 返回变量结构成员

C 返回变量结构成员,c,arrays,struct,C,Arrays,Struct,我需要返回一个包含两个值的结构。一个双值(time)和一个大小可变的uint8\t数组。我有两个函数,它们都应该返回相同类型的结构,但数据成员不同(data[9],data[64]) 我已经尝试创建一个包含额外成员size的结构,但这根本不起作用size应使用固定长度初始化数组,但编译器表示未定义变量大小 typedef struct Result { double time; int size; uint8_t data[size]; } 前一个数组不起作用,所以我尝

我需要返回一个包含两个值的结构。一个双值(
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] ...
}
我收到以下错误消息:

错误:返回类型是不完整的类型
结构的成员应该如主函数所示可用。我想编译器不知道
数据
数组应该有多大,但是也许有人可以解释一下这个上下文以及我关于如何返回包含可变大小数组的结构的问题


非常感谢您的帮助。

您需要使用灵活阵列成员(FAM):

然后,您可以使用
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()
)复制数据。

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

您可以按如下方式执行此操作:

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

非常感谢,这也很有效。必须将另一个答案标记为解决方案,因为另一个帖子早了一分钟。很抱歉
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;
}