void func(const char *s){
char *result = new char[strlen(s)];
strcpy(result, "new stuff");
s = result;
}
int main(){
const char *str = "old stuff";
func(str);
std::cout << str << "\n";
return 0;
}
上面的代码编译没有大惊小怪,但str
没有改变(仍打印出“旧东西”)。为什么是这样?据我所知,str
应该通过引用传递给函数,我应该能够重新分配const char *
以指向别的东西。
答案 0 :(得分:3)
上面的代码编译没有大惊小怪
这是预期的,因为你没有做任何与众不同的事情(当然,除了泄漏记忆)。
但
str
未更改(仍然打印出"old stuff"
)。这是为什么?
这是因为s
func
是来自str
的{{1}}指针的副本。重新分配此指针使得以前是某个其他位置的复制点;但是,原件保持不变。
据我所知,
main
应该通过引用传递给函数,我应该能够重新分配str
以指向别的东西。
隐式地没有通过引用传递任何内容;您必须指定函数通过引用获取其参数,否则它将按值传递。这包括指针。
使您的功能按预期执行所需的修复非常小:在const char *
前添加&符号。
s
答案 1 :(得分:1)
void func(const char *s){
char *result = new char[strlen(s)];
strcpy(result, "new stuff");
s = result;
}
它没有被更改,因为s
是调用者从main
传递的原始指针的本地副本。它只是指向与原始指针相同的地址。因此,当您执行此分配时,只会更改本地副本的值。