代码之家  ›  专栏  ›  技术社区  ›  Mark

Python ctypes:初始化c_char_p()

  •  3
  • Mark  · 技术社区  · 16 年前

    我写了一个简单的C++程序来说明我的问题:

    extern "C"{
        int test(int, char*);
    }
    
    int test(int i, char* var){
        if (i == 1){
            strcpy(var,"hi");
        }
        return 1;
    }
    

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

    我错过了什么?

    谢谢

    2 回复  |  直到 16 年前
        1
  •  8
  •   Alex Martelli    16 年前

    使用字符初始化的字符串 "bye" charP ,在第一次之后不会重新初始化。

    听从劝告 here

    然而,你应该小心,不要 将它们传递给期望的函数 创建字符串缓冲区函数,该函数

    “指向可变内存的指针”正是您的C函数所期望的,因此您应该使用 create_string_buffer 函数创建缓冲区,如文档所述。

        2
  •  2
  •   Evan Teran    16 年前

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