2013-10-28 65 views
0

我在分配内存时遇到了问题,就是Linux内核空间。我用下面的两个结构中创建了链接列表:Linux内核空间中的动态内存分配

struct Node{ 
    char *ptr; 
    struct Node *next; 
}; 

struct List{ 
    struct Node *head; 
    struct Node *tail; 
}; 

现在,当我尝试和分配列表结构[编辑,以反映正确的代码]:

struct List *ll = kmalloc(sizeof(struct List), GFP_KERNEL) 

我得到:

error: Initializer element is not constant 

我在这里做错了什么?我想补充的指针节点在我的列表结构因此我会通过添加它们:

struct Node n* = kmalloc(sizeof(Node)); 
n -> ptr = "Blah"; 
n -> next = NULL; 
ll -> head = n; 
+0

我很确定Linux内核头文件有链接列表的一些宏.... [here](http://kernelnewbies.org/FAQ/LinkedLists) –

+0

谢谢,如果这不起作用,我会检查一下。我之前看到了这一点,但认为自己编码会更容易。 C吓到我了! – Alex

+0

如果您希望稍后将代码提交到内核中,您应该正确使用*内核的习惯和编码规则。如果您被C吓到了,则应该先编码用户级应用程序,而不是内核代码。 –

回答

2

struct List ll*; 

struct List *ll; 

你有你的类型定义这个权利,但在kmalloc这两行中都是错误的。

+0

我的错误,我有结构列表* ll;在我的代码中,我必须复制它错误。这并没有解决我的问题,仍然出现错误。 – Alex

0

ERROR与内核编程无关,它与c编程有关。

error: Initializer element is not constant 

代码:

struct List{ 
    struct Node *head; 
    struct Node *tail; 
}; 
struct List *ll = kmalloc(sizeof(struct List), GFP_KERNEL) 

结构对象(默认)具有静态存储类。 使用静态存储持续时间的对象初始化必须使用常量表达式。 尝试在main()函数内分配内存。

具有静态持续时间的对象在外部函数中声明,或者在内部声明为 关键字extern或static作为声明的一部分。这些只能在编译时初始化。即不断的表达式