【问题标题】:Initialize Array of Pointers by Reference C++通过引用 C++ 初始化指针数组
【发布时间】:2013-07-21 23:37:41
【问题描述】:

基本上我要做的是在一个函数中初始化我的数组,但它会出现段错误:

void func(int **a, int x, int y) {
    a = new int*[x];

    for (int i=0; i<x; i++)
        a[i] = new int[y];
}

void main() {
    int **a;    
    func(a, 2, 3);
}

但是,如果我在函数外部初始化数组然后传递它,一切正常,我可以为它分配值/打印它们。我正在努力的是传递我的数组的引用,所以我不必在函数之外初始化它。

void func(int **a, int x, int y) {  
    for (int i=0; i<x; i++)
        a[i] = new int[y];
}

void main() {
    int x = 2;
    int **a = new int*[x];  
    func(a, x, 3);
}

【问题讨论】:

  • 我不相信代码段错误。但是,请注意main 中的a 未被修改。
  • 当我看到 int**a 在所谓的 C++ 代码中时,我就失去了兴趣

标签: c++ arrays pointers reference


【解决方案1】:

这里让你感到困扰的是 C(和 C++)缺乏按引用传递参数。 main() 中的 afunc() 中的 a 不同:

  1. amain 中声明。
  2. a 是按值传递的(因为没有其他方法)给func
  3. func 中的a 已分配给。
  4. func 返回。它的a 被破坏(内存泄漏),而maina 未初始化。
  5. ???
  6. main 尝试使用 a段错误!

这里有几个可能的解决方案:

  1. 使用经典的 C 方法:传递一个指向值的指针。在这种情况下,参数将是int ***a,这有点荒谬,但无论如何。

    void func(int ***a, int x, int y) {  
        *a = new int*[x];
        for (int i=0; i<x; i++)
            (*a)[i] = new int[y];
    }
    
    int main(int argc, char **argv) {
        ...
        int **a;
        func(&a, 2, 3);
        ...
    }
    
  2. 以 C++ 方式进行:传递引用。

    void func(int **&a, int x, int y) {
        //          ^
        // This is the only change. Neat!
    
  3. 以正确的方式(在我看来):从函数返回一个值,并从中初始化数组。

    int **func(int x, int y) {
        int **a = new int*[x]; // EDIT: Fixed stupid typo bug
        // existing code
        return a;
    }
    
    int main(int argc, char **argv) {
        ...
        int **a = func(2, 3);
        ...
    }
    

【讨论】:

  • 第二种方法是我一直在寻找的,现在它完美无缺。感谢您比较这 3 种不同的方式。
【解决方案2】:

您的原始代码所做的是修改 func 中的局部变量,而不是 main 中的局部变量。 这会做你想做的事:

void func(int **&a, int x, int y) {
    a = new int*[x];

    for (int i=0; i<x; i++)
            a[i] = new int[y];
}

void main() {
    int **a;    
    func(a, 2, 3);
}

否则我看不出你为什么会遇到段错误,除非你在调用 func 之后尝试访问 main 中的数组。

【讨论】:

    【解决方案3】:

    在您的第一个示例中。对func 的调用不会更改maina 的值。您可以让func 返回指向它创建的数组的指针,然后将该指针分配给main. 中的变量 更改示例代码如下所示:

    int** func(int x, int y) {
       int **a = new int*[x];
    
       for (int i=0; i<x; i++)
          a[i] = new int[y];
    
       return a;
    
    }
    
    void main() {
       int **a;    
       a = func( 2, 3);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多