2013-02-17 96 views
1

我用C寫的參數傳遞的C函數

FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1); 

BeginKey是之前調用函數的指針,而我並沒有啓動它的功能,像

BeginKey = NULL; 

FindBeginKey()功能,我將BeginKey分配給另一個指針,並嘗試在功能中打印出BeginKey的當前地址,它工作正確。 但是,當代碼從函數返回時,我嘗試再次打印出BeginKey的地址,它顯示0x0

爲什麼會發生這種情況,如果我想保留函數中分配的地址,我該怎麼辦?

+0

你能告訴我們「FindBeginKey」的類型以及你傳入的所有參數的類型嗎? – Xymostech 2013-02-17 17:40:11

回答

0

要傳遞一個值超出必須通過引用而非由值傳遞的功能的作爲通常使用C函數的情況。爲此,使參數成爲您想要傳遞的類型的指針。然後將值傳遞給&(地址操作數)的調用。

例如

FindFoo(FOO** BeginKey); 

,並稱之爲:

FindFoo(&BeginKey); 

,並在功能:

*BeginKey = 0xDEADC0DE; 
0

據我所知,您呼叫的功能等:

FindBeginKey(KeyListTraverser, BeginPage, BeginKey, key1); 

但是,當你試圖在BeginKey地址寫的,你基本上是在傳遞一個指針爲0x00。相反,你需要傳遞一個指向BeginKey的指針。

FindBeginKey(KeyListTraverser, BeginPage, &BeginKey, key1); 

如果這不是你的意思,它肯定會有幫助,如果你發佈的代碼示例。

0

如果你想修改子程序的參數,你應該傳遞的東西的指針你想修改。

void subroutine(int* x) { 
    *x = 5; // will modify the variable which x points to 

    x = 5; // INVALID! x is a pointer, not an integer 
} 
0

我不知道現在所有的C參數傳遞規則,所以這個答案可能有點過時。從構建應用程序所調用的應用程序和庫的常見做法來看,C函數的返回將包含狀態,因此函數的調用者可以根據狀態代碼作出決定。

如果你想修改它的輸入參數的功能,則可以通過將參考&my_val,其中int my_val;傳遞這些參數。而且你的函數必須像這個*my_val一樣取消引用my_val來獲得它的值。

此外,出於性能方面的原因,地址(通過引用)可能更可取,以便您的應用程序不會打擾將參數的值複製到局部變量中。該序言碼由編譯器生成。單個參數,char,int等等非常簡單。

我很習慣C++在C++中通過引用傳遞,不需要解引用。編譯器的代碼爲您處理。

但是,請考慮將指針傳遞給結構。

struct my_struct 
{      
    int iType; 
    char szName[100]; 
} struct1; 

struct my_struct *pStruct1 = &struct1; 

如果該結構包含填充在上一次初始化,然後在你的程序中引用查找數據,然後按值傳遞pStruct1一個指針結構。如果您正在編寫函數來填充該結構或更改已經存在的數據,則將值傳遞給結構的指針。你仍然可以改變結構指針指向的內容。

如果另一方面您正在編寫一個函數來爲指針分配內存,然後傳遞指針的地址(指向指針的指針)&pStruct1,以便您將指針指向正確的內存。