在Cython中创建C结构体

16 投票
2 回答
20369 浏览
提问于 2025-04-17 08:55

我想用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

撰写回答