2009-05-31 13 views
3

私はC言語で開発されたライブラリ(特にHTK)を使用しています。私はソースを少し修正し、関数からポインタ(リンクされたリストの先頭まで)を取得しようとしました。 あまり詳しく説明しません。 OutTypeという名前の構造体があるとします。私のC++コードでは、次のように宣言します。 OutType * Out; LName(.....、OutType * Out) ここで、Cライブラリでは、LNameはパラメータOutを取り、Outが戻り値であるSaveHという関数を呼び出します(Out = SaveH (...))とSaveHで、OutはmallocされますOutType returnOut =(OutType *)malloc(1、sizeof(OutType)); 私が見る限り、Outは完全にmallocされています.LName関数では、割り当てられたメモリ領域のアドレスを取得できます。しかし、私がC++コードに戻り、LNameを呼び出してOutをパラメータとして渡すと、そのパラメータは常にアドレスとして0を持ちます。 同じものをそのまま残して、Outだけが返り値ではなく、SaveH(....、OutType * Out)というパラメータをすべて渡す前にC++コードでその値を割り当てるようにSaveHを変更します。 それは正常ですか? C++コードを使用して、Cライブラリに割り当てられたポインタに問題がありますか? ありがとうC++でCライブラリから返されたポインタを使用する

答えて

7

ポインタのコピーを渡しています。そのため、Cライブラリの変更はC++コードには表示されません。

すでにライブラリを変更しているので、そのC関数にはのポインタへのポインタが必要です。

LName(....., OutType** Out) 

*Out=SaveH(...); 

これで、Cコードが同じ元のポインタを変更するように、C++ポインタのアドレスを渡します。

2

あなたが機能している場合:

void Foo(int * p) { 
    p = malloc(sizeof(int)); 
} 

を、あなたはそれを呼び出すとき:

int * x; 
Foo(x); 

ポインタのコピーが取られているので、xの値は、変更されません。その後、

void Foo(int ** p) { 
    *p = malloc(sizeof(int)); 
} 

:あなたは、ポインタへのポインタを必要とする

int * x; 
Foo(& x); 

これはあなたの問題ではない場合、あなたがについて尋ねているかを示すいくつかの実際のコードを投稿してください。

関連する問題