2012-04-09 48 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