c ++:在函数中重新分配const char

时间:2016-03-11 19:53:06

标签: c++ pointers char const

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 *以指向别的东西。

2 个答案:

答案 0 :(得分:3)

  

上面的代码编译没有大惊小怪

这是预期的,因为你没有做任何与众不同的事情(当然,除了泄漏记忆)。

  

str未更改(仍然打印出"old stuff")。这是为什么?

这是因为s func是来自str的{​​{1}}指针的副本。重新分配此指针使得以前是某个其他位置的复制点;但是,原件保持不变。

  

据我所知,main应该通过引用传递给函数,我应该能够重新分配str以指向别的东西。

隐式地没有通过引用传递任何内容;您必须指定函数通过引用获取其参数,否则它将按值传递。这包括指针。

使您的功能按预期执行所需的修复非常小:在const char *前添加&符号。

s

Demo.

答案 1 :(得分:1)

void func(const char *s){
    char *result = new char[strlen(s)];
    strcpy(result, "new stuff");
    s = result;    
}

它没有被更改,因为s是调用者从main传递的原始指针的本地副本。它只是指向与原始指针相同的地址。因此,当您执行此分配时,只会更改本地副本的值。