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