1

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

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

3 回答 3

4

这里让您感到困扰的是 C(和 C++)缺乏按引用传递的参数。ain与inmain()不同:afunc()

  1. a在中声明main
  2. a按值传递(因为没有其他方法)到func.
  3. ain被func分配到。
  4. func返回。它a被破坏(泄漏内存),并且main'sa未初始化。
  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);
        ...
    }
    
于 2013-07-21T23:53:30.517 回答
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 中的数组。

于 2013-07-21T23:51:29.087 回答
0

在你的第一个例子中。调用func不会改变ain的值main。您可以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);
}
于 2013-07-21T23:53:04.587 回答