gpt4 book ai didi

c - 具有灵活数组成员的返回结构

转载 作者:太空狗 更新时间:2023-10-29 16:13:00 27 4
gpt4 key购买 nike

我需要从 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/17724548/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com