C lwn.net中示例代码的容器
当看到:C lwn.net中示例代码的容器,c,linux-kernel,C,Linux Kernel,当看到: void my_object_release(struct kobject *kobj) { struct my_object *mine = container_of(kobj, struct my_object, kobj); /* Perform any additional cleanup on this object, then... */ kfree (mine); } 在中,第三个参数kobj中似乎不正确。我认为应该是kobject给定的代码是正确的
void my_object_release(struct kobject *kobj)
{
struct my_object *mine = container_of(kobj, struct my_object, kobj);
/* Perform any additional cleanup on this object, then... */
kfree (mine);
}
在中,第三个参数
kobj
中似乎不正确。我认为应该是kobject
给定的代码是正确的:第三个参数是指针指向的容器结构成员的名称,而不是其类型,因此kobj
是正确的。这个示例有些混乱,因为第一个kobj
与第二个kobj
不对应:第一个是调用方作用域中的指针
下面是一个图表,希望能澄清的容器\u的参数:
container_of(kobj, struct my_object, kobj)
| | |
| | |
\------------+----------+--------------------------------\
| | |
| | |
/-----------------/ | |
| | |
V /-------------/ |
+------------------+ | |
| struct my_object | { | |
+------------------+ V V
+------+ +------+
struct kobject | kobj |; <-- You have a pointer to this, called | kobj |
+------+ +------+
...
};
container_of(kobj,struct my_object,kobj)
| | |
| | |
\------------+----------+--------------------------------\
| | |
| | |
/-----------------/ | |
| | |
V/--------------/|
+------------------+ | |
|结构my|u对象{|
+------------------+V V
+------+ +------+
struct kobject | kobj |;第三个参数是指针指向的容器结构成员的名称,而不是其类型