Python的ctypes的:初始化c_char_p()
-
18-09-2019 - |
题
我写了一个简单的C ++程序,说明我的问题:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
}
return 1;
}
我编译成所以这个。从蟒我称:
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
我是什么失踪?
感谢。
解决方案
您与人物"bye"
,且其地址,你继续服用,并分配给charP
初始化字符串,没有在第一时间拿到后重新初始化。
照做这里:
您应该小心,但是,不 期望传给功能 指向可变的内存。如果你 需要可变的内存块,ctypes的有 一个create_string_buffer功能, 这些以各种方式创建。
一个“指向可变的内存”是你的C函数期望的是什么,所以你应该使用create_string_buffer
函数来创建缓冲区,作为文档解释了。
其他提示
我猜测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
只是要求缓冲区溢出
不隶属于 StackOverflow