我有以下非常简单的程序。
int modify(char * v){
v = "123" ;
return 0;
}
int main (int argc, char** argv){
char *test = new char[10];
modify(test);
std::cout << test;
return 0;
}
我知道我可以打印出"123",但我故意用这种方式来学习指针是如何工作的。但是,不会打印"123"。我应该如何正确地传递指针?
您必须记住,在C++中,参数默认由值传递,这意味着在函数中您有副本。,并且修改副本不会改变原始副本。
如果您想将指针更改为指向其他对象,则需要通过引用传递。然而,在这种情况下,它将导致其他问题,因为您随后会丢失原始指针。
因此,解决方案是使用通过引用传递的std::string
,或者使用strcpy
顶部副本到目标内存区域(但如果使用strcpy
,则必须注意不要写超出分配的内存)。
在修改strcpy(v, "123")
中尝试此操作
您的代码有几个问题。
你的modify()
功能实际上什么都没改变:
int modify(char * v) {
v = "123"; // overwrites the parameter value copy on the stack
// with a char[] literal pointer
return 0;
}
您需要从文字复制到指针:
int modify(char* v) {
strcpy(v,"123");
return 0;
}
您没有释放分配的内存,这可能会在其他情况下导致内存泄漏
int main (int argc, char** argv){
char *test = new char[10];
modify(test);
std::cout << test;
delete [] char; // <<< Note
return 0;
}
正如Joachim Pileborg已经提到的,c++最合适的解决方案是使用std::string
而不是char*
。