2009-05-31 15 views
3

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++

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