2012-04-09 76 views
0

有人可以指出爲什麼下面的代碼需要修改函數中的char **指針。如果我只是通過char *並修改了值,一旦函數調用返回k有垃圾值。有人可以證明這一點嗎?修改函數中的指針值

char* call() 
{ 
    return "fg"; 
} 
void modify(char** i) 
{ 
    *i = call(); 
} 

int main() 
{ 
    char* k= new char[3]; 
    modify(k); 
} 
+1

這是怎麼編譯的? 'modify'採用'char **'類型的參數而不是'char *'。另外,請使用'std :: string'。 – Mahesh 2012-04-09 17:38:11

+0

是的,請張貼實際編譯的代碼;否則可能很難說出你在問什麼。 – 2012-04-09 17:41:14

回答

5

當你傳遞的東西變成一個功能,你通過它按值。這意味着該功能在副本上運行。

這也適用於指針。如果你傳遞一個char *,那麼該指針的副本就會被創建;原始指針未被修改。如果您想修改原始指針本身,則需要通過char **參數傳遞其地址。


注:

1.另外值得指出的是,你的代碼中包含了內存泄漏。你動態地分配一些內存,然後丟失它的指針,這意味着你永遠不能delete它。

2.在C++中,通常應避免像這樣傳遞原始指針,因爲它會導致痛苦和困惑。你應該看看智能指針。

+0

值得注意的是,在C++中,它通常會給出更多可讀代碼來傳遞對指針的引用,而不是指向指針的指針 - 但在C中,這不是一個選項。 – Ricibob 2012-04-09 17:42:22

+0

更多可讀的代碼是的。聲明雖然很有趣。讓我們拋出一個模板... – 2012-04-09 17:43:16

+0

如果我修改「修改」函數程序以引用指針並在調用時傳遞地址,那麼該怎麼辦?會不會有內存泄漏? – user1177586 2012-04-10 09:27:19