簡體   English   中英

Python ctypes:初始化c_char_p()

[英]Python ctypes: initializing 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我打電話:

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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM