我需要从 C 函数返回一个具有灵活数组成员的结构,但无法弄清楚为什么它不能编译。我知道返回数组可以通过将它们封装在一个结构中来实现,如下所示:
struct data_array {
long length;
double data[];
};
我的函数是这样的:
struct data_array test (int length) {
struct data_array a;
double* b = malloc (1000);
a.length = 1000;
a.data = b;
return a;
}
但是,编译器返回:“灵活数组成员的使用无效”。
根据“21st Century C”一书,结构中的数据数组作为指针处理(这对我来说非常有意义)。它尚未初始化,因此不应为其分配内存来保存其数据。 (甚至编译器也不知道它需要多少内存)。所以我必须分配内存并将其分配给我的返回变量。
那么,为什么编译器会返回错误呢?我该如何解决这个问题?
最佳答案
您可以将 data
声明为不完整数组(没有指定维度的数组)或将其声明为指针。 (结构中的不完整数组必须是最后一个成员,称为灵活数组成员。)
如果您将其声明为不完整数组,则该结构实质上包含 length
元素以及您为其分配的任意数量的数组元素。您必须使用结构的基本大小加上所有元素的空间来分配它,例如:
struct data_array *b = malloc(sizeof *b + NumberOfElements * sizeof *b->data);
但是,您不应返回以这种方式分配的结构,因为无法返回灵活数组的额外元素——函数的返回类型将仅包括结构的基本大小。但是,您可以返回指向该结构的指针。因此,您可以返回 b
而不是 *b
。
如果您将data
声明为指针,那么您将创建结构并单独为data
分配空间以指向,如:
struct data_array b;
b.length = NumberOfElements;
b.data = malloc(NumberOfElements * sizeof *b.data);
这里是代码示例。首先,使用灵活的数组成员:
struct data_array
{
long length;
double data[];
};
struct data_array *test(size_t NumberOfElements)
{
struct data_array *b = malloc(sizeof *b + NumberOfElements * sizeof *b->data);
// Put code here to test the result of malloc.
b->length = NumberOfElements;
return b;
}
或者用一个指针:
struct data_array
{
long length;
double *data;
};
struct data_array test(size_t NumberOfElements)
{
struct data_array b = { NumberOfElements,
malloc(sizeof *b + NumberOfElements * sizeof *b->data) };
// Put code here to test the result of malloc.
return b;
}
关于c - 具有灵活数组成员的返回结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58423097/