如何在C语言中将结构体数组的属性作为参数传递给函数?

3
所以这是我的问题。
我有一个结构体,其中包含一些属性:
struct foo {
  const uint8_t propertyA;
  int propertyB;
  const int propertyC;
  typeX propertyD;
  typeY propertyE;
};

因为我必须表示对象foo的多个实例,所以我创建了这个结构体的数组:

const int foosQuantity = 8;
struct foo foos[foosQuantity] = 
   {{ .propertyA=0b11001100, .propertyB=0, .propertyC=140, ...},
   { .propertyA=0b11001000, .propertyB=0, .propertyC=150 ...},  

          //*** foosQuantity-3 MORE TIMES ***//

   { .propertyA=0b11001000, .propertyB=0, .propertyC=150 ...}}

到目前为止,一切似乎都正常工作。然而,我还没有想出如何将一个类型的属性数组发送到函数中。例如,我有一个在外部库中编写的函数,它需要一个属性A的数组:

void myFunc(const uint8_t *propertyAs, sizeArray){

    //*** DO STUFF ***//

}

我希望可以直接发送我的结构体属性,而不必使用循环遍历结构体数组并复制元素。
int main(){

  //*** STUFF ***//

  myFunc(foos.propertyA, foosQuantity); 

  //*** MORE STUFF ***//

  return 0;
}

这个可行吗?


2
你可能希望避免复制循环;不幸的是,你的愿望将无法实现。没有明智的、可支持的方法来传递结构数组中仅包含“propertyN”元素的方式。但是,不要忘记传递数组很廉价;只会向函数传递一个指针。 - Jonathan Leffler
那些const成员意味着您不能有效地使用malloc()动态分配您的结构体 - 您可以使用calloc(),但值将为零且无法更改。这可能不是您想要的。 - Jonathan Leffler
2个回答

5

如果整个结构体数组已经存在于您程序的内存中,那么最有效的方法就是仅传递指向数组开头的指针、数组的长度(以元素计)并迭代数组的propertyA成员:

void bar(struct foo *p, size_t len)
{
    size_t i;
    for(i = 0; i < len; i++)
    {
        dosomething(p[i].propertyA);
    }
}

如果你受限于指定规范只允许传递一个propertyA (即uint8_t)数组到函数中,那么你必须将它们从struct foo的数组中复制出来,没有其他办法。


事实上,我并没有编写函数“myFunc()”,它来自外部库。但是,我可以访问源代码,所以我想最好的做法是重新编写myFunc(),使其接受一个类型为struct foo的指针,就像你所写的那样。 - Alexis
@Alexis 你也可以选择我提到的后一种选项,将 propertyA 的值隔离出来。 - Govind Parmar

1
这是不可能的。
你可以选择:
1. 使用仅包含propertyA的平行数组,与foo数组一起操作。 2. 或者创建一个propertyA数组,然后将其复制回foo数组中。
选项1是最节省内存的,因为它需要最少的内存,但可能需要重写大量代码。
选项2需要更多的内存和时间,但需要重新编写代码的数量最少。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接