当前位置:  技术问答>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;
}

|
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所指地址的值。

|
LZ在整网络内核的代码 
但是C基础不够牢啊 
多看看C的书籍吧 看看 值传递和地址传递

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.sql类types的类成员方法: struct定义及介绍
  • linux 下结构struct ethhdr,struct iphdr在那个头文件下;谢谢!!
  • java命名空间java.sql接口struct的类成员方法: getsqltypename定义及介绍
  • typedef_struct与struct之间的区别
  • java命名空间java.sql接口struct的类成员方法: getattributes定义及介绍
  • struct sock *sk和 struct sk_buff *skb之间的关系
  • 知道TCP/UDP的包头,如何判断其应用层协议类型,struct tcphdr和 struct udphdr结构中那个变量能判断应用层协议类型。
  • struct task_struct * get_current(void)函数的解释--help!!
  • 任意struct問題
  • Linux内核中work_struct的定义
  • NOSQL iis7站长之家
  • struct dirent的问题
  • 关于struct timespec的一个问题
  • 没有名字的struct
  • struct in_addr 和 unsigned long的转换
  • 求解struct的大小
  • Python struct.unpack
  • 请教struct sembuf的结构是怎样,急!急!急!!!!!!!!
  • 请问:从哪个header文件中看struct tty_driver的定义
  • 用g++开发,怎么设置结构(struct)1字节对齐?
  • struct timeval结构体的作用是什么呢?谢谢


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3