【问题标题】:Sending Pointers of Structs to a Function in C将结构的指针发送到 C 中的函数
【发布时间】:2017-09-05 13:05:06
【问题描述】:

我不喜欢这个,但我有一个内部有近 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];
  }

}

由于这个结构如此之大,正如我所说的那样,其中有近 45 个成员,我认为指向该结构将大大有助于优化此过程。我将如何做到这一点?


以防万一,这是我的结构的 typedef

typedef struct
{ 
  //Basically, everything we want to read from HUDL should be here...
  int play_num;
  char down;
  char dist[3];
  char ydln[4];
  char gnls[3];
  char hash[3];
  char home[20];
  char away[20];
  char odk[2];
  char qtr[2];
  char series[3];
  char result[20];
  char penalty[20];

  char act_cb[20]; //How do they act post-snap
  char act_dl[20];
  char act_lb[20];
  char act_ol[20];
  char act_qb[20];
  char act_rb[20];
  char act_saf[20];

  char aln_cb[20]; //How do they align pre-snap
  char aln_dl[20];
  char aln_lb[20];
  char aln_ol[20];
  char aln_qb[20];
  char aln_rb[20];
  char aln_saf[20];
  char aln_wr[20];

  char blitz[20];
  char box_cnt[3];
  char saf_count[20];
  char coverage[20];
  char cvr_basic[20];
  char def_front[20]; 
  char mtn_def[20];
  char num_rush[3];

  char off_form[20];
  char form_var[20];
  char motion[20];
  char off_pro[20];
  char off_play[20];
  char play_var[20];
  char personnel[20];
  char play_type[20];


  char time[2]; 
  char score_diff[4];
  char field_zone[2];
  char dd_type[2];
  char form_strength[2];

} HUDL; // MAXIMUM of 63 Members

【问题讨论】:

  • 阅读任何good beginners book。他们应该有关于如何使用指针的章节,包括指向结构的指针。
  • 查看 SPlatten 的回答并注意指针 (*) 和 (&amp;) 运算符的地址的使用。看书。
  • 你的旧函数,即void init_struct(struct general){ 是错误的,不能是使用的那个
  • 您命名和分组成员的方式表明可能有一些较小的结构试图退出。从一些小结构开始然后使用它们构建下一个级别并不罕见。除非ydlngnls 是问题领域中众所周知的术语,否则我会尝试使用一些更易于阅读的名称。
  • 了解指向结构和指针数组的指针。

标签: c function pointers struct


【解决方案1】:

您的代码有几处错误。 首先,您的函数定义是错误的,因为您省略了参数名称。您的函数定义应如下所示:

void init_struct(struct general mygeneralstruct){}

或者,您可以使用 typedef 为您的结构使用别名,如下所示:

typedef struct {
  int a;
} general;

在这种情况下,您的函数声明可能如下所示:

void init_struct(general mygeneralstruct){}

在声明结构数组时也会遇到同样的问题。您省略了变量的名称。而不是

struct general[10];

应该是

struct general mygeneralstruct[10]

general mygeneralstruct[10](typedef)

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

void init_struct(general* mygeneralstruct){}

以及循环中的代码:

init_struct(&mygeneralstruct[i]);

【讨论】:

    【解决方案2】:

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

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

    我不确定你为什么不使用 typedef 'HUDL' 让生活变得更轻松,代码更易于阅读。

    【讨论】:

    • 在我看来有一个typedef
    • 是的,有,但没有被使用。
    【解决方案3】:

    一种更简洁更好的方法是使用构造函数和析构函数来动态分配内存给结构并在使用后释放它。

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

    【讨论】:

    • 不能在数组声明中使用非 const 局部变量 num。
    • 这个例子最好用类而不是结构来重写。
    • 我打赌它会是......但前提是我们有 C 类。感谢您指出另一个问题......我已将变量更改为预定义值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2021-01-26
    • 1970-01-01
    • 2012-10-05
    • 2015-06-12
    相关资源
    最近更新 更多