返回变量结构成员

时间:2019-03-06 19:00:47

标签: c arrays struct

我需要返回一个带有两个值的结构。一个双精度值(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数组应该有多大,但是也许有人可以向我解释这个上下文以及我的问题,即如何返回其中包含可变大小数组的结构。

我将不胜感激,非常感谢。

2 个答案:

答案 0 :(得分:2)

您需要使用灵活数组成员(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())进行复制。

答案 1 :(得分:2)

没有大小的数组元素作为结构的最后一个成员称为 flexible array member 。具有此类成员的结构只能通过动态内存分配来创建,并为所需的数组大小分配足够的空间。

您可以执行以下操作:

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