有人可以指出爲什麼下面的代碼需要修改函數中的char **指針。如果我只是通過char *並修改了值,一旦函數調用返回k有垃圾值。有人可以證明這一點嗎?修改函數中的指針值
char* call()
{
return "fg";
}
void modify(char** i)
{
*i = call();
}
int main()
{
char* k= new char[3];
modify(k);
}
有人可以指出爲什麼下面的代碼需要修改函數中的char **指針。如果我只是通過char *並修改了值,一旦函數調用返回k有垃圾值。有人可以證明這一點嗎?修改函數中的指針值
char* call()
{
return "fg";
}
void modify(char** i)
{
*i = call();
}
int main()
{
char* k= new char[3];
modify(k);
}
當你傳遞的東西變成一個功能,你通過它按值。這意味着該功能在副本上運行。
這也適用於指針。如果你傳遞一個char *
,那麼該指針的副本就會被創建;原始指針未被修改。如果您想修改原始指針本身,則需要通過char **
參數傳遞其地址。
注:
1.另外值得指出的是,你的代碼中包含了內存泄漏。你動態地分配一些內存,然後丟失它的指針,這意味着你永遠不能delete
它。
2.在C++中,通常應避免像這樣傳遞原始指針,因爲它會導致痛苦和困惑。你應該看看智能指針。
值得注意的是,在C++中,它通常會給出更多可讀代碼來傳遞對指針的引用,而不是指向指針的指針 - 但在C中,這不是一個選項。 – Ricibob 2012-04-09 17:42:22
更多可讀的代碼是的。聲明雖然很有趣。讓我們拋出一個模板... – 2012-04-09 17:43:16
如果我修改「修改」函數程序以引用指針並在調用時傳遞地址,那麼該怎麼辦?會不會有內存泄漏? – user1177586 2012-04-10 09:27:19
這是怎麼編譯的? 'modify'採用'char **'類型的參數而不是'char *'。另外,請使用'std :: string'。 – Mahesh 2012-04-09 17:38:11
是的,請張貼實際編譯的代碼;否則可能很難說出你在問什麼。 – 2012-04-09 17:41:14