我写了一个简单的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只是要求缓冲区溢出

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top