Python-ctypes: bei der Initialisierung c_char_p()
Schrieb ich ein einfaches C++ - Programm zu veranschaulichen mein problem:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
}
return 1;
}
Ich kompilieren diese in ein so. Von python nenne ich:
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
Wenn ich diesen starte, meine Ausgabe ist:
bye
hi
hi
hi
hi
Ich erwartet hatte:
bye
hi
bye
bye
bye
Was bin ich?
Dank.
InformationsquelleAutor Mark | 2009-12-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Zeichenfolge, die Sie initialisiert mit den Zeichen
"bye"
ist, und dessen Adresse, die Sie halten und die Zuordnung zucharP
, nicht erneut initialisiert, nachdem das erste mal.Befolgen Sie die Ratschläge hier:
Einen "Zeiger auf veränderbare Speicher" ist genau das, was Ihre C-Funktion erwartet, und so sollten Sie die
create_string_buffer
Funktion zu erstellen, die Puffer, weil die docs erklären.InformationsquelleAutor Alex Martelli
Ich vermute, dass python ist die Wiederverwendung der gleichen Puffer für alle 5 Pässe. sobald Sie es auf "hi", Sie niemals wieder "bye" können Sie etwas wie das hier tun:
aber seien Sie vorsichtig,
strcpy
ist nur zu Fragen, für ein buffer overflowInformationsquelleAutor Evan Teran