在Cython中创建C结构

时间:2011-12-23 15:45:47

标签: python c struct cython

我想使用Cython创建我自己的列表容器。我是一个非常新的开始,按照文档我可以创建这样的结构:

cdef struct s_intList:
    int    value
    void*  next
ctypedef s_intList intList

但是到了访问struct成员的时候,我找不到好的语法:

cpdef void  foo():
    cdef intList*    li
    # li.value OR li->value

throws:“警告:intlists.pyx:8:12:赋值前引用的局部变量'li'” 让我假设我的cython结构使用不正确......

请问我在这里做错了什么? :) 谢谢你的帮助

2 个答案:

答案 0 :(得分:12)

您必须为intList分配内存。使用局部变量或 使用malloc。

cdef struct s_intList:
    int    value
    void*  next

ctypedef s_intList intList

cpdef object foo():
    cdef intList li
    li.value = 10

答案 1 :(得分:4)

在您的代码中,liintList指针。此指针未初始化为指向任何内容,因此访问li.value毫无意义(并且是错误的)。

在fabrizioM的回答中,堆栈上创建了intList(不是指向一个的指针),因此在内存中为li.value保留了一个位置。

如果你想用实际数据创建一个intList(我收集你想要的是一个链表数据结构),如果你想能够从函数中返回intList等等,你必须在堆上分配你的intList结构,并从那里建立完整的链表。 Cython允许您轻松调用malloc(和free)来完成此操作。