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