2009-05-31 20 views
3

我正在使用C開發的庫(特別是:HTK)。我已經對源進行了一些修改,並嘗試從函數獲取指針(到鏈表的開始處)。 不要進入太多細節;說我有一個名爲OutType的結構。在我的C++代碼中,我聲明: OutType * Out;並將它傳遞給函數LName(.....,OutType * Out) 現在,在C庫中,LName接受參數Out,並調用名爲SaveH的函數,其中Out是返回值(Out = SaveH (...))並且在SaveH中,Out被malloc化爲OutType returnOut =(OutType *)malloc(1,sizeof(OutType)); 據我所知,Out完全是malloc'ed,並且在LName函數中,我可以獲取分配的內存區域的地址。但是,當我返回到我的C++代碼中,在那裏我調用LName並將Out作爲參數傳遞時,該參數始終具有0作爲地址。 如果我保留所有內容,但只需更改SaveH,以便Out不是返回值,而是一個參數SaveH(...,OutType * Out)並在傳遞所有內容之前在C++代碼中分配該值是很好的。 這是正常的嗎?在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); 

如果這不是你的問題,發佈一些實際的代碼,說明你是問什麼。