Ich verwende eine Bibliothek in C entwickelt (insbesondere: HTK). Ich habe ein paar Änderungen an der Quelle vorgenommen und versucht, einen Zeiger (zum Anfang einer verknüpften Liste) von einer Funktion zu erhalten. Nicht zu sehr ins Detail gehen; sage ich habe eine Struktur namens OutType. In meinem C++ Code erkläre ich: OutType * Out; und übergeben Sie es an eine Funktion LName (....., OutType * Out) Nun nimmt in der C-Bibliothek LName Parameter Out, und ruft eine Funktion namens SaveH, wobei Out ist der Rückgabewert (Out = SaveH (...)) und in SaveH wird Out malloc'ed als OutType returnOut = (OutType *) malloc (1, sizeof (OutType)); Soweit ich sehe, Out ist perfekt malloc'ed, und in LName Funktion kann ich die Adresse des Speicherbereichs, der zugeordnet wurde. Aber wenn ich zu meinem C++ - Code zurückkomme, wo ich LName anrufe und Out als Parameter übergebe, hat dieser Parameter immer 0 als Adresse. Wenn ich alles gleich lasse, aber nur SaveH ändern, so dass Out kein Rückgabewert ist, sondern ein Parameter wie SaveH (...., OutType * Out) und diesen Wert in C++ code zuweisen, bevor alles übergeben wird, ist in Ordnung. Ist das normal? Gibt es ein Problem mit dem Zeiger, der in der C-Bibliothek zugewiesen wird und in C++ - Code verwendet? DankeVerwendung von Zeiger zurückgegeben von C-Bibliothek in C++
3
A
Antwort
7
Sie übergeben eine Kopie des Zeigers, weshalb die Änderung in der C-Bibliothek nicht in Ihrem C++ - Code angezeigt wird.
Da Sie bereits die Bibliothek ändern, sollten Sie diese C-Funktion einen Zeiger auf einen Zeiger haben.
Jetzt übergeben Sie die Adresse des C++ - Zeigers, damit Ihr C-Code den gleichen ursprünglichen Zeiger ändert.
2
Wenn Sie eine Funktion:
void Foo(int * p) {
p = malloc(sizeof(int));
}
dann, wenn Sie es nennen:
int * x;
Foo(x);
der Wert von x wird nicht geändert, weil eine Kopie des Zeigers genommen wird. Sie benötigen einen Zeiger auf einen Zeiger:
void Foo(int ** p) {
*p = malloc(sizeof(int));
}
dann:
int * x;
Foo(& x);
Wenn dies nicht Ihr Problem ist, schreiben einige aktuelle Code, der zeigt, was Sie fragen.
Verwandte Themen
- 1. gleiche Adresse in C# struct Zeiger zurückgegeben
- 2. Zeiger zurückgegeben von DLL-Funktion beim Aufruf von Rebol
- 3. Verwendung von unsigned char Zeiger
- 4. C++ Template Verwendung Probleme Zeiger
- 5. Konvertieren von C++/CLI-Zeiger in nativen C++ - Zeiger
- 6. Zeiger unter Verwendung von Werten aus einer Funktion zurück (C++)
- 7. Smart-Zeiger Verwendung
- 8. Handhabung Array zurückgegeben von C++ dll C#
- 9. Anruf mono_method (Zeiger) von c
- 10. Der Zeiger von C-Code
- 11. Löschen von char-Array zurückgegeben von getenv()
- 12. Null Zeiger bei der Verwendung von GSON
- 13. klare Karte von Vektor-Zeiger in C++
- 14. Konvertieren von C-Code in Java: Zeiger
- 15. Konvertieren von multidimensionalen Arrays Zeiger in C++
- 16. Falsche Größe zurückgegeben von systemLayoutSizeFittingSize bei Verwendung von Multiline-Etikett
- 17. bei der Verwendung von "Zeiger" und "Zeiger auf Zeiger" in Linkliste verwirrt
- 18. Verwendung von Dereferenzierungsoperator in diesem Beispiel (C++)
- 19. Verwendung von in_addr in C#
- 20. Verwendung von AppDomain in C#
- 21. Verwendung von Pthread in C++
- 22. Verwendung von XGBOOST in C++
- 23. Verwendung von "Klasse" in C#
- 24. Verwendung von Threads in C++
- 25. Verwendung von scanf() in C
- 26. Übergabe Zeiger zwischen C++ - Projekt und C# -Projekt ohne Verwendung von unsicheren auf C# -Projekt
- 27. Zeiger auf Zeiger in C++
- 28. Verwendung von C++ in einem iOS CocoaPod
- 29. String zurückgegeben von C-Funktion ist Müll
- 30. C: malloc'ed Zeiger ändert seinen Standort, nachdem er von der Funktion zurückgegeben wurde?