Cython

时间:2016-07-26 05:22:41

标签: python cython

以下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_testertest()函数中以某种方式被截断。如何防止这种情况发生,并获得预期的输出?

1 个答案:

答案 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