在Cython中创建C结构体
我想用Cython创建一个自己的列表容器。我刚开始学习这个,按照文档的指导,我成功创建了这样的结构:
cdef struct s_intList:
int value
void* next
ctypedef s_intList intList
但是当我想访问这个结构里的成员时,我找不到正确的写法:
cpdef void foo():
cdef intList* li
# li.value OR li->value
这段代码报错:“警告:intlists.pyx:8:12:局部变量'li'在赋值前被引用”,这让我觉得我在使用Cython结构时可能有问题……
请问我哪里做错了呢? :) 感谢你的帮助
2 个回答
6
在你的代码中,li
是一个指向 intList
的指针。这个指针没有被初始化,也就是说它没有指向任何东西,所以去访问 li.value
是没有意义的(而且会出错)。
在 fabrizioM 的回答中,创建了一个 intList
(而不是指向它的指针),这个列表是在栈上创建的,因此内存中为 li.value
保留了一个位置。
如果你想创建一个包含实际数据的 intList
(我猜你是想做一个类似链表的数据结构),并且希望能够从函数中返回这个 intList
等等,你就需要在堆上分配你的 intList
结构,并从那里构建完整的链表。Cython 让你可以很方便地调用 malloc
(和 free
)来实现这一点。
17
你需要为intList分配内存。可以使用一个局部变量,或者用malloc这个函数。
cdef struct s_intList:
int value
void* next
ctypedef s_intList intList
cpdef object foo():
cdef intList li
li.value = 10