Python ctypes: Initialisierung c_char_p ()
-
18-09-2019 - |
Frage
Ich schrieb ein einfaches C ++ Programm, mein Problem zu veranschaulichen:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
}
return 1;
}
ich kompilieren diese in eine so. Von Python Ich nenne:
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
Als ich das laufen, meine Ausgabe lautet:
bye
hi
hi
hi
hi
ich erwartet hatte:
bye
hi
bye
bye
bye
Was bin ich fehlt?
Danke.
Lösung
Die Zeichenfolge, die Sie mit dem Zeichen "bye"
initialisiert und deren Adresse, die Sie immer wieder zu nehmen und charP
zuweisen, nicht nach dem ersten Mal neu initialisiert erhalten.
Beachten Sie die Hinweise hier :
Sie sollten vorsichtig sein, jedoch nicht auf geben sie nicht an Funktionen erwarten Zeiger auf änderbare Speicher. Wenn du müssen wandelbar Speicherblöcke, ctypes hat eine Funktion, die create_string_buffer schafft diese auf verschiedene Weise.
Ein „Zeiger auf änderbare Speicher“ ist genau das, was Ihre C-Funktion erwartet, und so sollten Sie die create_string_buffer
Funktion verwenden, um diese Puffer zu schaffen, wie die Dokumentation erklären.
Andere Tipps
Ich vermute, Python ist die Wiederverwendung der gleichen Puffer für alle 5 Pässe. wenn Sie es auf „hallo“ gesetzt, können Sie es nie auf „bye“ zurückwerfen können Sie etwas tun:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
} else {
strcpy(var, "bye");
}
return 1;
}
aber vorsichtig sein, strcpy
ist nur für einen Pufferüberlauf zu fragen