【问题标题】:Return variable struct members返回变量结构成员
【发布时间】:2019-07-28 13:10:07
【问题描述】:

我需要返回一个包含两个值的结构。一个双精度值 (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 数组应该有多大,但也许有人可以解释一下这个上下文以及我关于如何返回一个包含可变大小数组的结构的问题。

如果有任何帮助,我将不胜感激,非常感谢。

【问题讨论】:

    标签: c arrays struct


    【解决方案1】:

    你需要使用一个灵活的数组成员(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())进行复制。

    【讨论】:

      【解决方案2】:

      作为结构的最后一个成员的未调整大小的数组元素称为灵活数组成员。具有这种成员的结构只能通过动态内存分配来创建,并为所需的数组大小分配足够的空间。

      你可以这样做:

      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;
      }
      

      【讨论】:

      • 非常感谢,这也有效。必须将另一个答案标记为解决方案,因为另一个帖子早一分钟。对不起。
      猜你喜欢
      • 2020-06-22
      • 2011-12-19
      • 1970-01-01
      • 2019-03-02
      • 2020-08-26
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多