簡體   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