【问题标题】:Is it possible to return an structure array in C language?是否可以用 C 语言返回结构数组?
【发布时间】:2018-08-01 18:31:15
【问题描述】:

例如,我有下一个代码,并想返回 sensorData 结构数组。

struct SensorData[] process_data(struct SensorData sensorData[]){
sensorData[0].LED_1 = 1+1;
sensorData[0].LED_2 = 2+2;
return sensorData; }

对我来说它甚至无法编译。

【问题讨论】:

  • 不是直接的。但是你返回的是一个传入的指针;你不能什么都不返回吗?调用者已经决定了数据应该去哪里。
  • 如果询问构建错误,请始终包括您得到的实际错误。请编辑您的问题以显示错误。完整且完整地复制粘贴(作为文本)它们,无需任何编辑。
  • 是的,我知道我可以使用指针,也许对于这个例子来说它看起来毫无意义......但是可以不用指针吗?只是返回?

标签: c arrays structure


【解决方案1】:

它不能编译,因为 C 不允许返回一个数组,但它允许你返回一个指针。

【讨论】:

  • 嗯,好吧,所以不可能返回任何类型的数组?!
  • 不,不可能从 C 中的函数返回数组:参见此处,例如:tutorialspoint.com/cprogramming/…
  • 在传递参数时,您真正传递的是一个 struct SensorData *,因为参数列表中的数组符号只是指针符号的语法糖。
  • 对于一维数组,是的,但是对于具有更多维度的数组,编译器需要知道除了最外层长度之外的所有内容。
【解决方案2】:

如果您在将数组复制到堆栈以便可以将其作为返回值复制回来的问题上,您可以使用结构执行类似的操作,但这非常低效且似乎毫无意义。

struct {
    struct SensorData[100];
} sensorArray;

struct SensorArray process_data(struct SensorData sensorData[]) {
    sensorArray array;

    array.sensorData[0].LED_1 = 1+1;
    array.sensorData[0].LED_2 = 2+2;

    return array; 
}

main() {
    sensorArray copy;

    copy = process_data(copy.sensorData);
}

【讨论】:

    【解决方案3】:

    首先,您声明了一个未指定的数组类型(因为括号之间没有指定元素的数量)作为函数的返回值。这适用于参数(因为编译器将数组引用转换为指针,而实际声明确实是struct SensorData *。这可以通过参数来完成,但不能通过返回值来完成,必须完全指定。

    其次,你不能返回一个数组。数组标识符本身并不为 C 中的数组命名,而只是对第一个元素的引用(指针)。所以没有办法像struct那样返回一个数组,当你使用变量名时,你指的是整个变量。

    从这个意义上说,你可以这样做:

    struct SensorData {
        double values[100]; /* you have to be complete here */
    };
    

    然后:

    struct SensorData myFunction(struct SensorData data1) {
        struct SensorData value_to_return;
        ...
        return value_to_return;
    }
    

    但在此之前,您必须仔细考虑,因为您在参数data1 中传递了整个结构按值,因此必须在每次调用myFunction 时分配空间到存储要传递的变量的副本(记住所有变量都是按值调用的),并且必须为返回值保留空间(通常在线程堆栈上),该空间将由函数填充,然后复制回最终目的地。您将受到严重的效率损失。

    当你在两个 struct 对象之间进行赋值时,你会得到两个变量,如果你说的话

    struct SensorData a, b;
    

    以后

    a = b;
    

    没错...a 变量的所有字段都使用变量b 中的相同字段进行更新。但数组并非如此。

    struct SensorData a[100], b[100];
    

    即使两者都是同一类型(如上所示)

    a = b; /* this is incorrect */
    

    因为a 不是可赋值对象(左值,在 C 命名法中)...它只是指定为指向第一个数组元素的指针的数组的地址。

    问题是你有一种做你想做的事情的方法,只需将你的数组包装在结构中,然后你就可以像管理单元一样管理变量。

    struct SensorDataWrapper {
        struct SensorData array[100];
    } a, b;
    

    那你可以说

    a = b; 
    

    这两个结构都将从b 复制到a,没有任何问题。您将能够按值传递它们(不推荐)并将它们作为函数的返回值返回(也不推荐)

    C 中的类型是静态的,这意味着编译器在编译时严格定义它们......这使得开发在运行时更改的类型变得不可能,您必须为此使用动态结构。将指针以及指针和数组之间的兼容性传递给函数是将可变长度数组传递给函数的唯一方法,并且当您将参数声明为具有未指定数量元素的数组指针时,您正在声明一种不同类型的对象(实际上是指针而不是数组)

    【讨论】:

      猜你喜欢
      • 2015-06-07
      • 2022-01-19
      • 1970-01-01
      • 2021-07-07
      • 2015-03-06
      • 2014-06-02
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      相关资源
      最近更新 更多