以下Cython代码未按预期工作。
cdef char* char_tester():
py_str = "a\0b\0c".encode("UTF-8")
cdef char* c_str = py_str
return c_str
def test():
print(char_tester())
cdef char* my_str = char_tester()
for i in range(5):
print(my_str[i])
>>> test()
b'a'
97
55
10
0
99
我希望代码按顺序打印字节字符串'a b c'和ASCII值97,0,98,0,99。此外,当我添加for循环以打印for循环中的字符时,我得到预期的ASCII值作为输出。显然,char*
返回的char_tester
在test()
函数中以某种方式被截断。如何防止这种情况发生,并获得预期的输出?
答案 0 :(得分:3)
Assigment cdef char * s = py_str
指向char_tester()
返回后无效的内存位置。这类似于C函数将地址返回给本地堆栈分配的变量,未定义的行为。
使用以下功能
from libc.stdlib cimport malloc
from libc.string cimport memcpy
cdef char* char_tester():
py_str = "a\0b\0c".encode("UTF-8")
cdef char* c_str
cdef char * s = py_str
cdef ssize_t slen = len(py_str)
c_str = <char *>malloc((slen+1)*sizeof(char))
memcpy(c_str, s, slen)
c_str[slen] = '\0'
return c_str
测试代码将打印(python 3.4)
b'a'
97
0
98
0
99