我有以下非常简单的程序。
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”。我该如何正确传递指针?
答案 0 :(得分:7)
你必须记住,在C ++中,默认情况下,参数按值传递,这意味着在函数中你有副本。并且修改副本不会改变原文。
如果您想将指针更改为指向其他内容,则需要通过引用传递。但是,在这种情况下,它会导致其他问题,因为然后松开原始指针。
因此,解决方案是使用std::string
通过引用传递,或者使用strcpy
顶部副本到目标内存区域(但如果使用strcpy
,则必须注意不要写超出分配的内存。)
答案 1 :(得分:3)
在修改strcpy(v, "123")
答案 2 :(得分:1)
您的代码存在一些问题。
您的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*
。