用于指针的container_of()

qc6wkl3g  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(151)

我知道container_of()的作用,但我想在某个结构体中获得一个指针字段,如下所示:

struct A {
    int *ptr;
};

void some_func(int *ptr) {
    struct A *a = container_of(&ptr, struct A, ptr);
}

但它似乎不工作。这是编译成功,但看起来像它产生错误的指针:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

struct A {
    int *ptr;
};

void some_func(int *ptr)
{
    struct A *a = container_of(&ptr, struct A, ptr);
    if (a)
      pr_info("%d", *a->ptr);
    else
      pr_info("Ooops");
}

int __init m_init(void)
{
    int ptr = 10;
    struct A a = {.ptr = &ptr};

    some_func(&ptr);

    return 0;
}

void __exit m_exit(void)
{
}

module_init(m_init);
module_exit(m_exit);

MODULE_LICENSE("GPL");

如果我执行container_of(ptr, struct A, ptr);,则不会编译:

error: static assertion failed: "pointer type mismatch in container_of()"

我猜这是因为ptr是一个指针,而不是一个普通的int,所以__same_type将返回false,所以使它成为一个指针。
谁能帮我修修这个?

omhiaaxx

omhiaaxx1#

我不会工作,原因是m_init中的ptr是局部变量,所以它的地址&ptr对于重构另一个局部变量a的地址没有意义。
但是,您可以替换:

some_func(&ptr);

some_func(&a.ptr);

但是需要将some_fun改为struct A的指针成员int*,所以参数类型必须是int**

void some_func(int **ptr)
{
    if (!ptr) {
      pr_info("Ooops");
    } else {
      struct A *a = container_of(ptr, struct A, ptr);
      pr_info("%d", *a->ptr);
    }
}

相关问题