2013-07-21 104 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); 
}