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

标签 c return-value

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

相关文章:

mysql - 是否有可能用 return 之类的东西突破 mysql 存储过程?

c++ - memcmp 适用于非平面结构吗?

c - C 文件 I/O 中的段错误 11

c - 获取总视频内存大小

c++ - 函数返回临时对象行为不当

linux - 测试返回值 : command not found

JavaScript 返回函数而不是值

c - C 中是否可以有匿名的临时数组?

c# - vs2012 c# 与unix c server socket通信

Javascript + 和函数的字符串返回值?