【问题标题】:Storage size of isn't known存储大小未知
【发布时间】:2026-01-03 02:25:02
【问题描述】:

这是 IOCTL 开关盒的一部分。我收到以下错误?

错误:“数据”的存储大小未知 错误:“mesg”未声明(在此函数中首次使用)

case PASS_STRUCT:

        struct mesg{
            int pIDs[SIZE];
            int niceVal;
        };

        struct mesg data;

        ret = copy_from_user(&data, arg, sizeof(data));
        if(ret < 0){
            printk("PASS_STRUCT\n");
            return -1;  
        }

        printk("Message PASS_STRUCT : %d\n",data.niceVal);
        break;

SIZE 值在创建消息之前设置。

【问题讨论】:

    标签: c linux linux-kernel linux-device-driver ioctl


    【解决方案1】:
    struct mesg{
        int pIDs[SIZE];
        int niceVal;
    };
    

    SIZE 值在创建消息之前设置。

    在 C 中,SIZE 需要是一个真正的编译时常量才能像这样使用它。比如:

    #define SIZE 10
    

    您还应该将结构声明移到switch之外。

    【讨论】:

    • pIDs 数组的 SIZE 在每个驱动程序中都会发生变化,它没有定义为 #define SIZE 10。可以做什么?
    • @kani 是的。但它会带来其他变化。
    • 嗯是的 :-( 你能看看这个吗。*.com/questions/12130689/…。我在调用 PASS_STRUCT 之前定义了 SIZE 不能在该代码中做任何事情吗?
    • @kani 阅读更多关于 C 和 Linux 内部结构的信息:这比将代码从一个问题拖到另一个问题更容易
    • @kani,如果您希望数组大小是动态的,那么您真的需要一个int numIDs 元素并将pIDs 更改为一个指针(int * pIDs)。然后驱动程序必须分配一个大小为numIDs*sizeof(int) 的内存空间,然后使用pIDs 对该内存空间执行copy_from_user()