Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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; }

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 我期望:

我把它编译成一个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
我期望:

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下面的回答也应该解决这个问题,我会确保我的缓冲区足够大。