无法访问struct数据

时间:2014-02-07 09:33:59

标签: c linux-kernel kernel kmalloc

在头文件中:

typedef struct {
char* a;         
int allowed;

struct suit {
        struct t {
                char* option;
                int count;      
        } t;

        struct inner {
                char* option; 
                int count;      
        } inner;        
} suit;
} contain;

typedef struct {
       contain info;
} query_arg_t;

在内核模块中,

//初始化

static const contain _vector = { 
.a = "John",
.allowed = 1,
.suit = {
    .t = {
        .option = "ON",
        .count = 7
    },
    .inner = {
        .option = "OFF (*)",
        .count = 7
    }           
}
};

然而,正如我们尝试的那样:

query_arg_t q;

    q.info = kmalloc(sizeof(_vector), GFP_KERNEL);

我们会收到此错误: 错误:从类型'void *'

指定类型'contains'时不兼容的类型

上述错误由@SunEric和@Sakthi Kumar解决。

         q.info = kmalloc(sizeof(_vector), GFP_KERNEL);
        memcpy(&(q.info), &(_vector), sizeof(_vector));

现在看来还可以。 它构建但是当它运行到该部分时,它表明内核堆栈已损坏。 在尝试执行之后:

     printf("option: %s \n", q.info->suit.t.option); 
     printf("option: %s \n", q.info->suit.t.option);

[更新:已解决]

@Sakthi Kumar解决了它:

   //removing kmalloc
   // commenting out: q.info = &_vector;
   memcpy(&(q.info), &(_vector), sizeof(_vector));

printf("option: %s \n", q.info.suit.t.option);
printf("option: %s \n", q.info.suit.inner.option);

3 个答案:

答案 0 :(得分:2)

void * kmalloc (size_t size, int flags);

kmalloc返回您尝试分配给void *的类型contain不正确。

更改为,

typedef struct {
   contain *info; // info is a pointer to struct contain
} query_arg_t;

query_arg_t q;
q.info = kmalloc(sizeof(_vector), GFP_KERNEL);

回答后续问题:

q.info是指向contain的结构的指针。您需要数组运算符->来通过指针访问结构成员。请尝试使用以下选项访问info as,

q.info->stat.t.option

或者

(*q.info).stat.t.option

答案 1 :(得分:1)

您的结构为

形式
typedef struct {
       contain *info;
} query_arg_t;

您正尝试将指针(kmalloc返回void *)分配给struct变量(contain)。

答案 2 :(得分:0)

C语言规范禁止在不声明该类型成员的情况下在其他结构中声明结构类型。