我正在玩python ctypes,可能有人可以告訴我一些優雅的方式來處理在C中創建的導出緩衝區malloc
。python:使用ctypes處理c malloc變量
所以,這是一個非常愚蠢的C代碼,可以解釋我在找什麼。
#include <stdio.h>
#include <stdlib.h>
char * stringa;
int numero = 0;
int * numero_2;
void crea_variabili_dyn() {
if (numero_2 == NULL) {
numero_2 = malloc(1 * sizeof(int));
*numero_2 = 2;
}
}
void incrementa() {
numero += 1;
*numero_2 += 11;
}
void ciao() {
crea_variabili_dyn();
stringa = "cane.huu";
incrementa();
printf("%d\n", numero);
printf("%d\n", *numero_2);
printf("%s\n", stringa);
incrementa();
printf("%d\n", numero);
printf("%d\n", *numero_2);
printf("%s\n", stringa);
}
void main (void) {
//printf("%d\n", numero);
ciao();
//printf("%d\n", numero);
}
我編譯: GCC -shared -o playing_ctypes.so playing_ctypes.c
,然後我用蟒蛇玩:
import ctypes
testlib = ctypes.CDLL('/home/gnommaro/Dev/C/playing_ctypes.so')
c_numero = ctypes.c_int.in_dll(testlib, "numero")
c_numero_2 = ctypes.c_int.in_dll(testlib, "numero_2")
c_numero
c_numero_2
testlib.ciao()
c_numero
c_numero_2
至於用了就知道c_numero
是一個整數並在從python終端調用時返回c_long(54)
同時c_numero_2
是一個buffe r被動態分配,當它被調用時它返回c_void_p(147438576)
或c_long(147438576)
它依賴於聲明的ctypes導出類型。
當我打電話testlib.ciao()
一切正常的話,但如果我想增加,減少或簡單地改變這些任意整數的ctypes的一個價值,我可以覆蓋它以這種方式:
c_numero.value = 89
由於我們看到它的整數效果非常好。但對於malloched變量c_number_2
,屬性.value
返回緩衝區的地址(?),如果我想要更改其中的整數值,該怎麼辦?
或者,在其他的世界裏,如何以一種優雅的方式導出一個帶有ctypes的指針並且用他的內容值進行播放。
也許我會用memcpy
或者編寫一種python.ctypes處理程序,但是首先寫一些醜陋的硬編碼,我得問你的幫助。
那裏有嗎? :)