我有一个名为test.pyx
的Cython文件,其中包含以下代码:
from libc.stdlib cimport malloc, free
def test():
x = ["a1", "a2", "a3"]
cdef char** y = <char**> malloc(len(x) * sizeof(char*))
for i in range(len(x)):
item_uni = x[i].encode("UTF-8")
y[i] = item_uni
z = []
for i in range(len(x)):
item = y[i]
z.append(item)
print(z)
该功能应该看似打印["a1", "a2", "a3"]
。但是,它给了我三个"a3"
的实例:
>>> test()
[b'a3', b'a3', b'a3']
为什么会这样?
答案 0 :(得分:2)
这是因为涉及临时对象。 item_uni
内容可能始终具有相同的内存地址,y[i] = item_uni
将指向所有项目的相同地址,并且由于最后一个字符串是“a3”,因此将有三次“a3”
strdup
应该修复它(那时需要free
)
from libc.string cimport strdup
...
y[i] = strdup(item_uni)