Python ctypes:初始化c_char_p() 我写了一个简单的C++程序来说明我的问题: extern "C"{ int test(int, char*); } int test(int i, char* var){ if (i == 1){ strcpy(var,"hi"); } return 1; }
我把它编译成一个so。我从python调用:Python ctypes:初始化c_char_p() 我写了一个简单的C++程序来说明我的问题: extern "C"{ int test(int, char*); } int test(int i, char* var){ if (i == 1){ strcpy(var,"hi"); } return 1; },c++,python,ctypes,shared-objects,C++,Python,Ctypes,Shared Objects,我把它编译成一个so。我从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 我期望:
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
我错过了什么
谢谢。我猜python正在为所有5个过程重用相同的缓冲区。一旦您将其设置为“嗨”,您就再也不会将其设置为“再见”,您可以执行以下操作:
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
只是要求缓冲区溢出您用字符“bye”
初始化的字符串,以及您一直获取并分配给其地址的charP
,在第一次之后不会重新初始化
请遵循以下建议:
然而,你应该小心,不要
将它们传递给期望的函数
指向可变内存的指针。如果你
需要可变内存块,ctypes具有
创建字符串缓冲区函数,该函数
以各种方式创建这些
“指向可变内存的指针”正是您的C函数所期望的,因此您应该使用
create\u string\u buffer
函数来创建该缓冲区,正如文档所解释的那样。谢谢,将其更改为charP=create\u string\u buffer(“bye”),解决了我的问题。我应该仔细检查一下文档。关于strcpy和溢出的好消息,Alex下面的回答也应该解决这个问题,我会确保我的缓冲区足够大。