通过参考C ++初始化指针数组

时间:2013-07-21 23:37:42

标签: c++ arrays pointers reference

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

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

3 个答案:

答案 0 :(得分:4)

你在这里咬你的是C(和C ++)没有参考参数传递。 a中的main()a中的func()不同:

  1. amain中声明。
  2. a按值(因为没有其他办法)传递给func
  3. a中的func已分配给。
  4. func返回。其a被破坏(内存泄漏),而main的{​​{1}}未被初始化。
  5. ???
  6. a尝试使用main 段错误!
  7. 这里有一些可能的解决方案:

    1. 以经典的C方式执行:传递指向值的指针。在这种情况下,参数将是a,这有点荒谬,但无论如何。

      int ***a
    2. 以C ++方式执行:传递引用。

      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);
          ...
      }
      
    3. 正确(在我看来)这样做:从函数返回一个值,然后从中初始化数组。

      void func(int **&a, int x, int y) {
          //          ^
          // This is the only change. Neat!
      

答案 1 :(得分:1)

您的原始代码所做的是修改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中的数组。

答案 2 :(得分:0)

在你的第一个例子中。对func的调用不会更改amain的值。您可以让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);
}