您可以声明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;
}