繁体   English   中英

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

[英]Initialize Array of Pointers by Reference 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];
}

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

您在这里遇到的是C(和C ++)缺少按引用传递参数的情况。 amain()是从不同的afunc()

  1. amain声明。
  2. a通过值(因为没有其他方法)传递给func
  3. funca被分配给了。
  4. func返回。 它的a被破坏(泄漏内存),而maina未初始化。
  5. ???
  6. main试图使用a Segfault!

这里有一些可能的解决方案:

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

原始代码所做的是在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中的数组,否则我看不到您为什么会出现段错误。

在第一个示例中。 func的调用不会更改maina的值。 您可以让func返回一个指向它创建的数组的指针,然后将该指针分配给main.的变量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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM