在__register_chrdev_region中使用双指针(类型**)ptr(linux内核,4.14.13,x86_64)

时间:2018-03-13 03:41:46

标签: c linux-kernel

在linux内核(4.14.13,x86_64)中,函数__register_chrdev_region()声明了一个双指针变量struct char_device_struct **cp;但是,在整个函数中,永远不会直接使用cp的值,它总是像:*cp一样使用。我不明白这一点,为什么不定义像struct char_device_struct *cp这样的指针,然后使用像cp这样的变量。为了更清楚,例如,如果变量已被定义为:struct char_device_struct *cp,则函数中的以下代码:

for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next)
    if ((*cp)->major > major ||
       ((*cp)->major == major &&
       (((*cp)->baseminor >= baseminor) ||
       ((*cp)->baseminor + (*cp)->minorct > baseminor))))
            break;

本来可以写成:

for (cp = chrdevs[i]; cp; cp = (*cp)->next)
    if ((cp)->major > major ||
       ((cp)->major == major &&
       (((cp)->baseminor >= baseminor) ||
       ((cp)->baseminor + (cp)->minorct > baseminor))))
            break;

所以我不知道为什么指针cp被定义为双指针:struct char_device_struct **cp,那么它总是被'dereferenced'形式*cp使用?

1 个答案:

答案 0 :(得分:2)

因为下面的几行是对*cp的分配:

cd->next = *cp;
*cp = cd;