我写了一个简单的C ++程序来说明我的问题:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
}
return 1;
}
我将其编译成一个。从python我打电话:
from ctypes import *
libso = CDLL("Debug/libctypesTest.so")
func = libso.test
func.res_type = c_int
for i in xrange(5):
charP = c_char_p('bye')
func(i,charP)
print charP.value
当我运行它时,我的输出是:
bye
hi
hi
hi
hi
我期待:
bye
hi
bye
bye
bye
我错过了什么?
感谢。
答案 0 :(得分:8)
您使用字符"bye"
初始化的字符串,以及您继续使用并分配给charP
的地址,在第一次之后不会重新初始化。
按照建议here:
但是,你应该小心,不要 将它们传递给期待的功能 指向可变内存的指针。如果你 需要可变的内存块,ctypes有 一个create_string_buffer函数 以各种方式创造这些。
“指向可变内存的指针”正是您的C函数所期望的,因此您应该使用create_string_buffer
函数来创建该缓冲区,正如文档所解释的那样。
答案 1 :(得分:2)
我猜python正在为所有5次传递重用相同的缓冲区。一旦你把它设置为“hi”,你永远不会把它设置回“再见”你可以做这样的事情:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
} else {
strcpy(var, "bye");
}
return 1;
}
但要小心,strcpy
只是要求缓冲区溢出