2013-07-21 69 views
1

基本上什么,我试图做的是一个函数内初始化我的数组,但它出现segfaults:初始化数组通过引用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); 
} 
+1

我不相信代码SEG-故障。但是,请注意,'main'中的'a'没有被修改。 –

+8

我失去了兴趣第二我看到'int ** a'在所谓的C++代码 – sehe

回答

4

这是怎么咬你是C(和C++的)缺乏通过引用参数传递。在main()a是从afunc()不同:

  1. amain声明。
  2. a通过价值传递(因为没有其他方式)到func
  3. funca被分配给。
  4. func回报。它的a被破坏(内存泄漏),并且maina未被初始化。
  5. ???
  6. main尝试使用aSegfault!

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

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

第二种方式是我正在寻找,现在它的工作完美无瑕。感谢您比较3种不同的方式。 – user1647798

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后访问主阵列。

0

在你的第一个例子。调用funcmain改变a值。你可以有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); 
}