如何保持cython变量存活?

时间:2012-03-19 20:10:37

标签: c cython

我有一个传递给cython方法的字节字符串,我需要将它传递给c函数:

def stuff(bytes b):
    #b is b'something'
    some_c_function(b, len(b))

我传入的指针被保存到C-land内的某个结构中。当它被使用时,b已经消失,因此我遇到了分段错误。如何在功能之外保持活着?

我试过这样的事情:

from libc.stdlib import malloc, memcpy

def stuff(bytes b):
    cdef char *data
    data_len = len(b)
    data = malloc(data_len)
    memcpy(data, b, data_len)
    some_c_function(data, data_len)

但我在malloc电话上收到错误:Obtaining char * from temporary Python value

1 个答案:

答案 0 :(得分:1)

  1. 您需要cimport malloc函数,否则Cython会将导入作为默认的Python导入处理,并认为malloc是普通的Python函数。

  2. data_len应为len(b) + 1,最后一个字节必须设为0,即
    data[data_len - 1] = 0。这就是字符串在C / C ++中终止的方式。

  3. cimport - 编辑malloc并且Cython将该函数视为C函数之后,您需要进行强制转换,否则Cython编译器会抱怨。

    data = <char*> malloc(data_len)

  4. 拥有malloc - ed的内容需要自行解除 。确保这种情况发生。