我有一个传递给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
。
答案 0 :(得分:1)
您需要cimport
malloc
函数,否则Cython会将导入作为默认的Python导入处理,并认为malloc
是普通的Python函数。
data_len
应为len(b) + 1
,最后一个字节必须设为0
,即
data[data_len - 1] = 0
。这就是字符串在C / C ++中终止的方式。
在cimport
- 编辑malloc
并且Cython将该函数视为C函数之后,您需要进行强制转换,否则Cython编译器会抱怨。
data = <char*> malloc(data_len)
你拥有malloc
- ed的内容需要自行解除 。确保这种情况发生。