2

我有以下代码获取接口的 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按值返回大 s 是一个坏主意,因为您可能会用完堆栈空间(stackoverflow!)。如何更改上述代码以返回指向的指针if_mac?这有点令人困惑,因为有一个struct和一个“地址”运算符:S。

4

3 回答 3

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)
于 2012-06-18T09:46:50.880 回答
2

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

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

但是,鉴于大多数编译器无论如何都会优化大型结构返回到参数外调用,因此没有多大意义。你知道这个结构if_mac有多大吗?

于 2012-06-18T09:47:29.663 回答
0

Dynamically allocate memory (malloc) to if_mac and return the pointer Or Pass the pointer to the function itself, creating one before the function call and apply changes.

Dont return anything in second case. That may help.

于 2012-06-18T09:46:00.113 回答