在头文件中:
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);
[更新:已解决]
//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);
答案 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语言规范禁止在不声明该类型成员的情况下在其他结构中声明结构类型。