1

我正在尝试将 C 指针结构强制转换为对象类型,同时,无论该字段是什么类型,该结构的第一个字段都将递增 1。这种行为是预期的,我不应该将 C 指针转换为对象,或者 Cython 有问题吗?

示例代码:

C结构:

struct attr {
   int a;
};

赛通:pxd:

cdef class Attr(object):
   cdef attr * t

皮克斯:

cdef class Attr(object):
      __init__(self):
         self.t = malloc(sizeof(attr))
         self.t.a = 0

   attr(self):
       return <object>self.t

当创建 Attr 并运行 attr 方法时,t struct 的“a”字段正在递增(此示例只是我试图不运行的示例)感谢您的帮助

4

1 回答 1

3

是的,这是意料之中的。

您可能的目标是 Cython 能够在 C 结构和 Python 字典之间自动转换。无需<>在您的 Cython 代码中进行强制转换即可发生这种情况。为了让它工作,你需要告诉 Cython 结构成员。您确实需要取消引用指针:return self.t[0].

强制转换的<object>作用是告诉 Cython:“这个指针可以直接解释为PyObject*,我们现在负责对它进行引用计数。” C API 的模式是,您有各种不同的结构,都声明为以PyObject_HEAD. 然后,您可以将它们转换为和转换,PyObject*因为结构开头的内存布局是相同的。由于您的结构没有这种模式,您会得到无意义的结果。


(附录)我认为值得补充的是:这有可能比现在看起来更像一场灾难。如果 Python 认为“引用计数”达到 0,那么 Python 将尝试释放该对象。a 的第二部分PyObject是指向PyTypeObject定义类型的 的指针。一大堆事情(例如释放、打印对象、几乎任何与 Python 的交互)都可能导致 Python 尝试查找此类型对象,并且由于该结构不包含指向有效的指针,PyTypeObject因此这将结束失败了。

于 2019-06-20T13:12:23.400 回答