2012-06-18 42 views
2

我有以下的代碼,得到一個接口的MAC地址:這個代碼可以通過返回一個指向struct的指針來改進嗎?

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。

+2

您可以使用'malloc()'在堆上分配結構,然後返回一個指向它的指針。是否更好w.r.t性能只能通過分析兩個實現來確定。 –

+0

我同意Als的回答。當不再使用if_mac時,不要忘記釋放內存。 – MYMNeo

+0

或者你可以讓調用者分配一個(它已經有一個)並在一個額外的元素中傳遞一個指向該函數的指針:'void get_mac(ifreq * ptr,int socket_desc,char * if_name)' – wildplasser

回答

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

'if'中的嵌套條件不可讀。 – huon

0

動態分配內存(malloc)到if_mac並返回指針或將指針傳遞給函數本身,在函數調用之前創建一個指針並應用更改。

不要在第二種情況下返回任何東西。 這可能有幫助。

2

你會做的更好通過指針將結構作爲外出參數,從而推遲對呼叫者的動態內存管理(如果有的話)的決定和責任:

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

但是,由於大多數編譯器都會優化大型結構體返回到出參數調用,所以沒有多少意義。你知道struct if_mac有多大嗎?

相關問題