2009-12-09 31 views
1

我写了一个简单的C++程序来说明我的问题:的Python ctypes的:初始化c_char_p()

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 

我缺少什么?

谢谢。

回答

7

字符串您使用字符"bye"初始化的地址,以及您继续使用的地址和分配给charP的地址在第一次后不会重新初始化。

照做here

你应该小心,但是,不 期望传给 指向可变的内存功能。如果 需要可变内存块,ctypes具有 一个create_string_buffer函数,其中 以各种方式创建这些函数。

A“指向可变的内存”正是你的C函数需要什么,所以你应该使用create_string_buffer函数来创建缓冲区,作为文档解释。

+0

谢谢,将它改为charP = create_string_buffer(“bye”),修复了我的问题。我应该更好地审查文档。 – Mark 2009-12-09 03:30:38

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只是要求一个缓冲区溢出

+0

关于strcpy和overflow的好消息,Alex的答案也应该解决问题,我会确保我的缓冲区足够大。 – Mark 2009-12-09 03:31:44