Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 可以通过返回指向结构的指针来改进此代码吗?_C_Pointers - Fatal编程技术网

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

C 可以通过返回指向结构的指针来改进此代码吗?,c,pointers,C,Pointers,我有以下代码获取接口的MAC地址: static struct ifreq get_mac( int socket_desc, char *if_name ) {

我有以下代码获取接口的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\u mac
的指针?这只是有点混乱,因为有一个
结构和一个'address of'操作符:s.

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

在第二种情况下,不要退回任何东西。
这可能会有所帮助。

在参数中给出一个指向预期结构的指针:

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)

最好将struct by pointer作为out参数,从而将动态内存管理(如果有的话)的决策和责任推迟给调用者:

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

然而,考虑到大多数编译器都会优化大型结构返回到out参数调用,这并没有多大意义。你知道如果_mac
是多大的结构吗?

你可以使用
malloc()
在堆上分配结构,然后返回指向它的指针。这是否更好的w.r.t性能只能通过分析两个实现来确定。我同意Als的回答。如果不再使用mac,请不要忘记释放内存。或者您可以让调用者分配一个(它已经有一个)并在一个额外的元素中传递指向函数的指针:
void get\u mac(ifreq*ptr,int socket\u desc,char*if\u name)
根据我刚刚找到的,
struct ifreq
大约有32个字节。这不是一个“大的
结构”
。但是它在哪里存储名称呢?或者名称限制为3+1个字符?