通过传递的指针段错误初始化char数组

时间:2012-06-10 22:30:24

标签: c++ arrays

即,为什么以下工作:

    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);
    }

3 个答案:

答案 0 :(得分: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);
...

答案 1 :(得分:1)

您没有修改out,您需要通过引用传递指针:

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

现在你正在使用未初始化的指针调用memset

答案 2 :(得分: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 }
第9行的

char* bar未初始化,因此声明一个可指向任何位置的指针变量。第10行调用char_array,将该垃圾指针值复制到out参数。请注意,它是来自bar内的垃圾值的复制 - out获取值但与bar没有固有的连接。永远不会使用这个垃圾值 - 它只是被第2行new返回的指针覆盖,然后在函数返回时被丢弃。

要允许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修改它的位置。