向C中的函数发送结构指针

向C中的函数发送结构指针,c,function,pointers,struct,C,Function,Pointers,Struct,我不喜欢这个,但是我有一个结构,里面有将近45个成员;都是字符或字符数组。也就是说,我需要优化初始化每个结构的方式。通常,我会将整个对象传递到init_struct()函数中,但我觉得这不是最好的方法 我如何创建并使用指向结构的指针来实现这一点 旧方法看起来像这样: void init_struct(struct general){ ...initialize members... } int main(){ struct general[10]; for(int i = 0 ; i

我不喜欢这个,但是我有一个结构,里面有将近45个成员;都是字符或字符数组。也就是说,我需要优化初始化每个结构的方式。通常,我会将整个对象传递到init_struct()函数中,但我觉得这不是最好的方法

我如何创建并使用指向结构的指针来实现这一点

旧方法看起来像这样:

void init_struct(struct general){
...initialize members...
}

int main(){
  struct general[10];

  for(int i = 0 ; i < 10 ; ++i){
     init_struct(general[i];
  }

}
void init_struct(struct general mygeneralstruct){}
void init_struct(general mygeneralstruct){}

要传递指向数组元素的指针,只需在参数前面加上&,确保正确声明函数:

    void init_struct(HUDL* pGeneral){
        if ( pGeneral != NULL ) {
    //This will ensure the entire structure contains '0'
           memset(pGeneral, 0, sizeof(HUDL));
    ...initialize members...
        }
    }

    int main(){
        HUDL general[10];

        for( int i=0; i<(sizeof(general) / sizeof(general[0])); i++ ) {
            init_struct(&general[i]);
        }
    }
void init_struct(HUDL*pGeneral){
if(pGeneral!=NULL){
//这将确保整个结构包含“0”
memset(pGeneral,0,sizeof(HUDL));
…初始化成员。。。
}
}
int main(){
HUDL通用[10];

对于(inti=0;i来说,一种稍微干净、更好的方法是使用构造函数和析构函数来动态地为结构分配内存,并在使用后释放内存

static void HUDL_destroy(HUDL* ptr)
{
  if(ptr)
  {
    //...any other clean up that needs to be done goes here..
    free(ptr);
  }
}

static HUDL* HUDL_create()
{
  HUDL* ptr = malloc(sizeof(HUDL));

  if(!ptr)
    return NULL;

  //do initialization bits...
  init_struct(ptr);

  return ptr;
}

int main()
{
  //allocate and initialise structure
  HUDL *general = HUDL_create();

  //do stuff...

  //free structure after use
  HUDL_destroy(general);

}
在您的案例中可能需要一个指针数组,因此相应地修改main()

int main()
{
  //we need an array of structure pointers
  HUDL* general[SIZE];

  //allocate and initialize structure
  for(int i=0; i<SIZE; i++)
    general[i] = HUDL_create();

  //do stuff...

  //free structure after use
  for(i=0; i<SIZE; i++)
    HUDL_destroy( general[i] );
}
intmain()
{
//我们需要一个结构指针数组
HUDL*一般[尺寸];
//分配和初始化结构

对于(inti=0;i,您的代码有几处错误。 首先,您的函数定义是错误的,因为您忽略了参数名。您的函数定义应该如下所示:

void init_struct(struct general){
...initialize members...
}

int main(){
  struct general[10];

  for(int i = 0 ; i < 10 ; ++i){
     init_struct(general[i];
  }

}
void init_struct(struct general mygeneralstruct){}
void init_struct(general mygeneralstruct){}
或者,可以使用typedef为结构使用别名,如下所示:

typedef struct {
  int a;
} general;
在这种情况下,函数声明可能如下所示:

void init_struct(struct general){
...initialize members...
}

int main(){
  struct general[10];

  for(int i = 0 ; i < 10 ; ++i){
     init_struct(general[i];
  }

}
void init_struct(struct general mygeneralstruct){}
void init_struct(general mygeneralstruct){}
声明结构数组时,您遇到同样的问题。您省略了变量的名称

struct general[10];
应该是

struct general mygeneralstruct[10]
常规mygeneralstruct[10]
(typedef)

最后,不能通过将每个结构的值传递给函数来更改结构数组,而是需要传递每个结构的地址。 然后,您的函数声明应该是(使用typedef):

循环中的代码:

init_struct(&mygeneralstruct[i]);

阅读几乎所有内容。他们应该有关于如何使用指针的章节,包括指向结构的指针。请参阅Splaten的答案,并注意指针(
*
)的使用和(
&
)运算符的地址。阅读本书。您可以使用旧函数,即
void init_struct(struct general){
是错误的,不可能是被使用的。您命名和组成员的方式表明可能有一些较小的结构试图退出。从一些较小的结构开始,然后使用它们来构建下一个级别是很正常的。除非
ydln
gnls
是问题域中众所周知的术语,我会尝试使用一些更易于阅读的名称。阅读有关指向结构的指针和指针数组的内容。在我看来,似乎有一个
typedef
是的,有,但它没有被使用。不能在数组声明中使用非常量局部变量num。最好使用类而不是结构来重写该示例。I我敢打赌是的。但只有在我们有C类的情况下。谢谢你指出了另一个问题…我已经将变量更改为预定义值。