当前位置: 技术问答>linux和unix
struct net_device * p_dev和struct net_device ** p_dev有什么用法上的区别?
来源: 互联网 发布时间:2016-10-24
本文导语: 我原来的函数: //give the *dev by mac address, called by kernel; int get_dev_by_mac( char * mac, struct net_device * p_dev) { int flag = 0; struct mac_dev_entry *p_mac_dev; struct mac_dev_entry *p, *n; p_mac_dev=(st...
我原来的函数:
//give the *dev by mac address, called by kernel;
int get_dev_by_mac( char * mac, struct net_device * p_dev)
{
int flag = 0;
struct mac_dev_entry *p_mac_dev;
struct mac_dev_entry *p, *n;
p_mac_dev=(struct mac_dev_entry*)kmalloc(sizeof(struct mac_dev_entry),GFP_KERNEL);//分配内存空间.
if(!p_mac_dev)
{
printk("p_mac_dev kmalloc failed!!");
return -ENOMEM;
}
list_for_each_entry_safe(p, n, &mac_port_listhead, hlist)//这是一个循环.
{
p_mac_dev = p;//每个链表元素会在这里被取出来,做对比.
if(memcmp(p_mac_dev->addr, mac,6) == 0)
{
p_dev = p_mac_dev->dev;
//check the child dev stata;
if( !((p_dev->flags) & IFF_UP ))
{
printk("dev state is DOWN!!n" );
p_dev = NULL;
return -1;
}
else
{
p_dev = p_mac_dev->parent_dev;
flag = 1;
}
}
}
if(flag == 1)
return 0;
else
return -1;
}
然后在主程序中调用:
main()
{
struct net_device *dev;
.....
get_dev_by_mac(mac, dev);
}
我觉得这样做应该没问题,因为dev传的是一个指针.虽然没有初始化,去指向一个分配好了的空间,但是get_dev_by_mac里malloc了新的空间,并赋值给了dev.
然后我休假了.回来后,发现代码被同事改成了这样.因为已通过测试,他改的肯定是正确的.但我不好意思详细的问他原因,所以发到csdn上来问一下.
他改的:输入的参数类型变成了指向针的指针,为什么要这样改?与我的原代码相比有什么好处?
int get_dev_by_mac( unsigned char * mac, struct net_device **p_dev)
{
struct mac_dev_entry *p, *n;
list_for_each_entry_safe(p, n, &mac_port_listhead, hlist)
{
if(memcmp(p->addr,mac,6) == 0)
{
printk("p->dev:%sn",p->dev->name);
if(!((p->dev->flags) & IFF_UP))
{
printk("find the dev ,is downn");
return 1;
}
else
{
printk("find the dev ,is upn");
*p_dev = p->parent_dev;
return 0;
}
}
}
return 1;
}
//give the *dev by mac address, called by kernel;
int get_dev_by_mac( char * mac, struct net_device * p_dev)
{
int flag = 0;
struct mac_dev_entry *p_mac_dev;
struct mac_dev_entry *p, *n;
p_mac_dev=(struct mac_dev_entry*)kmalloc(sizeof(struct mac_dev_entry),GFP_KERNEL);//分配内存空间.
if(!p_mac_dev)
{
printk("p_mac_dev kmalloc failed!!");
return -ENOMEM;
}
list_for_each_entry_safe(p, n, &mac_port_listhead, hlist)//这是一个循环.
{
p_mac_dev = p;//每个链表元素会在这里被取出来,做对比.
if(memcmp(p_mac_dev->addr, mac,6) == 0)
{
p_dev = p_mac_dev->dev;
//check the child dev stata;
if( !((p_dev->flags) & IFF_UP ))
{
printk("dev state is DOWN!!n" );
p_dev = NULL;
return -1;
}
else
{
p_dev = p_mac_dev->parent_dev;
flag = 1;
}
}
}
if(flag == 1)
return 0;
else
return -1;
}
然后在主程序中调用:
main()
{
struct net_device *dev;
.....
get_dev_by_mac(mac, dev);
}
我觉得这样做应该没问题,因为dev传的是一个指针.虽然没有初始化,去指向一个分配好了的空间,但是get_dev_by_mac里malloc了新的空间,并赋值给了dev.
然后我休假了.回来后,发现代码被同事改成了这样.因为已通过测试,他改的肯定是正确的.但我不好意思详细的问他原因,所以发到csdn上来问一下.
他改的:输入的参数类型变成了指向针的指针,为什么要这样改?与我的原代码相比有什么好处?
int get_dev_by_mac( unsigned char * mac, struct net_device **p_dev)
{
struct mac_dev_entry *p, *n;
list_for_each_entry_safe(p, n, &mac_port_listhead, hlist)
{
if(memcmp(p->addr,mac,6) == 0)
{
printk("p->dev:%sn",p->dev->name);
if(!((p->dev->flags) & IFF_UP))
{
printk("find the dev ,is downn");
return 1;
}
else
{
printk("find the dev ,is upn");
*p_dev = p->parent_dev;
return 0;
}
}
}
return 1;
}
|
int get_dev_by_mac( char * mac, struct net_device * p_dev)
里面的 p_dev 是一个形参,在 get_dev_by_mac 函数申请内存,得到内存地址的值并赋给了 p_dev,但是但函数返回时,原来的传递进来的实参的值并没有改变。因此需要用 struct net_device **p_dev。
就像下面这个函数一样
void func(int val)
{
val = 1;
}
void funcp(int *valp)
{
*valp = 1;
}
int main()
{
int a = 0;
func(a);
// 调用 func(a) 后,因为函数里面改变的是形参的值,a 的值还是 0,没有被改成1
funcp(&a);
// 这时传进去的是a的地址,funcp 函数里面对改地址的内容进行改变,因此a的值改成了1
return 0;
}
要注意:
int get_dev_by_mac( char * mac, struct net_device * p_dev)
里面要得到的是p_dev的值(即一个地址),而不是p_dev所指地址的值。
里面的 p_dev 是一个形参,在 get_dev_by_mac 函数申请内存,得到内存地址的值并赋给了 p_dev,但是但函数返回时,原来的传递进来的实参的值并没有改变。因此需要用 struct net_device **p_dev。
就像下面这个函数一样
void func(int val)
{
val = 1;
}
void funcp(int *valp)
{
*valp = 1;
}
int main()
{
int a = 0;
func(a);
// 调用 func(a) 后,因为函数里面改变的是形参的值,a 的值还是 0,没有被改成1
funcp(&a);
// 这时传进去的是a的地址,funcp 函数里面对改地址的内容进行改变,因此a的值改成了1
return 0;
}
要注意:
int get_dev_by_mac( char * mac, struct net_device * p_dev)
里面要得到的是p_dev的值(即一个地址),而不是p_dev所指地址的值。
|
LZ在整网络内核的代码
但是C基础不够牢啊
多看看C的书籍吧 看看 值传递和地址传递
但是C基础不够牢啊
多看看C的书籍吧 看看 值传递和地址传递
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。