You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

成员为指针类型时如何使用container_of宏?编译报错求助

解决container_of宏编译错误:pointer type mismatch

你遇到的编译错误源于container_of宏的用法完全错误,核心问题是参数类型与宏的要求不匹配:

  • container_of的作用是通过指向结构体成员的指针,反向获取整个结构体的指针。它的参数规则为:container_of(ptr, struct_type, member_name),其中ptr必须是指向struct_type中member_name成员的指针,而非成员的值。
  • 你的代码中,myStruct.somePointer是struct abc*类型的变量(值为&innerStruct),但你把它当成了指向ContainingStruct中somePointer成员的指针传入宏。而somePointer成员本身是struct abc*类型,指向它的指针应该是struct abc**类型,两者类型不匹配,触发了内核的静态断言检查。

解决方案分两种场景:

场景1:通过somePointer成员的地址获取ContainingStruct指针

如果你的需求是已知ContainingStruct实例中somePointer成员的地址,要拿到整个结构体的指针,修正代码如下:

#include <stddef.h>
#include <linux/kernel.h>  // 内核环境需引入此头文件获取container_of宏

struct abc {
    // ... struct abc的成员
};

struct ContainingStruct {
    int someData;
    double someDouble;
    struct abc *somePointer;
};

int main() {
    struct ContainingStruct myStruct;
    struct abc innerStruct;

    myStruct.somePointer = &innerStruct;

    // 修正:传入指向somePointer成员的指针(&myStruct.somePointer)
    struct ContainingStruct *containingPtr = 
        container_of(&myStruct.somePointer, struct ContainingStruct, somePointer);

    containingPtr->someData = 42;
    containingPtr->someDouble = 3.14;

    return 0;
}

场景2:通过innerStruct的指针找到指向它的ContainingStruct实例

如果你的真实需求是已知innerStruct的指针,要找到哪个ContainingStruct的somePointer指向了它,container_of无法直接实现此功能——因为innerStruct并非ContainingStruct的成员,只是被其指针成员引用。这种场景下需要自行维护映射关系,比如:

  • 将所有ContainingStruct实例加入链表,遍历链表检查每个实例的somePointer是否等于目标指针;
  • 使用哈希表,以struct abc*为键、struct ContainingStruct*为值建立映射。

内容的提问来源于stack exchange,提问作者Milan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:07:26