我有以下代码获取接口的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。
答案 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
并返回指针或将指针传递给函数本身,在函数调用之前创建一个并应用更改。
在第二种情况下不要退货。 这可能有所帮助。