【问题标题】:Initializing a char array through passed pointer segfaults通过传递的指针段错误初始化 char 数组
【发布时间】:2012-06-10 22:30:24
【问题描述】:

即,为什么以下工作:

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

【问题讨论】:

标签: c++ arrays


【解决方案1】:

将 '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);
...

【讨论】:

  • 啊哈,是的。愚蠢的错误。谢谢:)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:
     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 在哪里修改它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      相关资源
      最近更新 更多