在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
使用?
答案 0 :(得分:2)
因为下面的几行是对*cp
的分配:
cd->next = *cp;
*cp = cd;