0

即,为什么以下工作:

    char* char_array(size_t size){
            return new char[size];
    }

    int main(){
            const char* foo = "foo";
            size_t len = strlen(foo);
            char* bar=char_array(len);
            memset(bar, 0, len+1);
    }

但以下段错误:

    void char_array(char* out, size_t size){
            out= new char[size];
    }

    int main(){
            const char* foo = "foo";
            size_t len = strlen(foo);
            char* bar;
            char_array(bar, len);
            memset(bar, 0, len+1);
    }
4

3 回答 3

2

将 'bar' 传递给 char_array 是在调用时传递该指针的当前值的副本- 所以 char_array 中的 'out' 指向与 'bar' 相同的东西,但它们是完全独立的变量,当 char_array返回新分配的值只是丢失了。

如果你想实际修改'bar'变量,你需要传递一个指针或对bar变量本身的引用,即

void char_array(char** out, size_t size) {
    *out = new char[size];
}

...
char_array(&bar, len);

或者

void char_array(char*& out, size_t size) {
    out = new char[size];
}

...
char_array(bar, len);
...
于 2012-06-10T22:37:19.320 回答
1

你不是在修改out,你需要通过引用传递指针:

void char_array(char*& out, size_t size)
//                   |
//           pass by reference

现在你正在调用memset一个未初始化的指针。

于 2012-06-10T22:32:34.143 回答
1
 0 void char_array(char* out, size_t size)
 1 {
 2    out = new char[size];
 3 }

 5 int main()
 6 {
 7    const char* foo = "foo";
 8    size_t len = strlen(foo);
 9    char* bar;
10    char_array(bar, len);
11    memset(bar, 0, len+1);
12 }

char* bar第 9 行没有初始化,所以声明了一个可以指向任何地方的指针变量。第 10 行调用 char_array,将垃圾指针值复制到out参数中。请注意,复制的是 bar 内的垃圾值 -out获取该值但与bar. 这个垃圾值永远不会被使用——它只是被new第 2 行返回的指针覆盖,然后在函数返回时被丢弃。

要允许char_array更改bar自身,请使用对指针的引用:

void char_array(char*& out, size_t size) { out = new ... }

...或指向指针的指针...

void char_array(char** p_out, size_t size) { *p_out = new ... }

char_array(&bar, len);

无论哪种方式都char_array知道在哪里bar修改它。

于 2012-06-10T22:42:31.187 回答