可以通过返回指向结构的指针来改进此代码吗?

时间:2012-06-18 09:39:21

标签: c pointers

我有以下代码获取接口的MAC地址:

static struct ifreq get_mac( int socket_desc, char *if_name ) {                                                                                                                                                                         
      struct ifreq if_mac;                                                                                                                                                                                                                
      memset( &if_mac, 0, sizeof( struct ifreq ) );                                                                                                                                                                                       
      strncpy( if_mac.ifr_name, if_name, IFNAMSIZ - 1 );                                                                                                                                                                                  
      ...                                                                                                                                                                                                                                  
      return if_mac;                                                                                                                                                                                                                      
}

我的C经验仅限于我在大学时所做的。我大致得到指针,但我知道按值返回大struct是一个坏主意,因为你可以用尽堆栈空间(stackoverflow!)。如何更改上面的代码以返回指向if_mac的指针?它只是有点令人困惑,因为有一个struct和一个'地址'运营商:S。

3 个答案:

答案 0 :(得分:3)

在参数中给出指向期望结构的指针:

static int ifreq get_mac(int socket_desc, char *if_name, struct ifreq **if_mac)
{
      if (NULL == (*ifmac = malloc(sizeof (struct ifreq))) {
          return -1;                                        
      }                                                                                                                                                                                                                                                                                                                            
      memset(*if_mac, 0, sizeof(struct ifreq));                                                                                                                                                                                       
      strncpy((*if_mac)->ifr_name, if_name, IFNAMSIZ - 1);                                                                                                                                                                                  
      ...                                                                                                                                                                                                                                  
      return 0;                                                                                                                                                                                                                      
}

如果调用者已经为结构分配了空间,则函数原型变为:

static int ifreq get_mac(int socket_desc, char *if_name, struct ifreq *if_mac)

答案 1 :(得分:2)

您最好将指针作为out参数取出,从而将动态内存管理(如果有)的决策和责任推迟给调用者:

static void get_mac( int socket_desc, char *if_name, struct ifreq *if_mac ) { 
    ...
}

然而,鉴于大多数编译器无论如何都会优化大型struct返回到out-parameter调用,没有多大意义。你知道结构if_mac有多大吗?

答案 2 :(得分:0)

动态地将内存(malloc)分配给if_mac并返回指针或将指针传递给函数本身,在函数调用之前创建一个并应用更改。

在第二种情况下不要退货。 这可能有所帮助。