有人可以指出为什么下面的代码需要修改函数中的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