首先,您声明了一个未指定的数组类型(因为括号之间没有指定元素的数量)作为函数的返回值。这适用于参数(因为编译器将数组引用转换为指针,而实际声明确实是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 中的类型是静态的,这意味着编译器在编译时严格定义它们......这使得开发在运行时更改的类型变得不可能,您必须为此使用动态结构。将指针以及指针和数组之间的兼容性传递给函数是将可变长度数组传递给函数的唯一方法,并且当您将参数声明为具有未指定数量元素的数组指针时,您正在声明一种不同类型的对象(实际上是指针而不是数组)