2016-04-20 65 views
3

因此,我讀了幾十個例子,將二維數組指針傳遞給函數以獲取/更改函數中該數組的值。但是有可能在函數內部創建(分配內存)。事情是這樣的:通過將指針傳遞給函數創建二維數組c

#include <stdio.h> 

void createArr(int** arrPtr, int x, int y); 

int main() { 

    int x, y;  //Dimension 
    int i, j;  //Loop indexes 
    int** arr;  //2D array pointer 
    arr = NULL; 
    x=3; 
    y=4; 

    createArr(arr, x, y); 

    for (i = 0; i < x; ++i) { 
     for (j = 0; j < y; ++j) { 
      printf("%d\n", arr[i][j]); 
     } 
     printf("\n"); 
    } 
    _getch();  
} 

void createArr(int** arrPtr, int x, int y) { 
    int i, j;  //Loop indexes 
    arrPtr = malloc(x*sizeof(int*)); 
    for (i = 0; i < x; ++i) 
     arrPtr[i] = malloc(y*sizeof(int)); 

    for (i = 0; i < x; ++i) { 
     for (j = 0; j < y; ++j) { 
      arrPtr[i][j] = i + j; 
     } 
    }  
} 
+0

是的,它是可能的。 – Martin

+0

代碼中沒有數組指針,也沒有任何2D數組。 – Lundin

+0

@Martin 你能告訴我如何? – Marcin

回答

2

是,指針傳遞到int **(但3星被認爲是不好的風格),我建議從你的函數返回一個分配的變量:使用

int **createArr(int x, int y) 
{ 
    int **arrPtr; 
    int i, j;  //Loop indexes 

    arrPtr = malloc(x*sizeof(int*)); 
    if (arrPtr == NULL) { /* always check the return of malloc */ 
     perror("malloc"); 
     exit(EXIT_FAILURE); 
    } 
    for (i = 0; i < x; ++i) { 
     arrPtr[i] = malloc(y*sizeof(int)); 
     if (arrPtr[i] == NULL) { 
      perror("malloc"); 
      exit(EXIT_FAILURE); 
     } 
    } 
    for (i = 0; i < x; ++i) { 
     for (j = 0; j < y; ++j) { 
      arrPtr[i][j] = i + j; 
     } 
    } 
    return arrPtr; 
} 

調用它:

arr = createArr(x, y); 
+2

你應該檢查'malloc'的所有返回值,不僅是第一個。 – mch

+1

沒有理由創建一個分段的指針指針。相反,當你想要一個2D數組時,使用一個2D數組。 – Lundin

+0

Soo ..我可以這樣做: void createArr(int *** arrPtr,int x,int y); 這裏arrPtr是指向一個** int的指針,它可以包含數組的地址。但它看起來不好。 另一種方式,更優雅,是你展示的。非常感謝您提供快速解答! – Marcin

0

是的,數組可以用這種方式初始化。只要你傳遞一個指針,內存地址應該保持不變。所以,如果你指定了任何指針,它將會有效。

思考的一個[]作爲*指針的第一個元素

一個[] []將是一個**指針的第一個元素的指針或指向所述第一陣列(第一行)

3

忘記指針指針。它們與二維數組無關。

如何正確操作:How do I correctly set up, access, and free a multidimensional array in C?

使用指針指針錯誤的原因之一:Why do I need to use type** to point to type*?。你如何能做到這一點正確

例子:

#include <stdio.h> 
#include <stdlib.h> 


void* create_2D_array (size_t x, size_t y) 
{ 
    int (*array)[y] = malloc(sizeof(int[x][y])); 

    for (size_t i = 0; i < x; ++i) 
    { 
    for (size_t j = 0; j < y; ++j) 
    { 
     array[i][j] = (int)(i + j); 
    } 
    } 

    return array; 
} 

void print_2D_array (size_t x, size_t y, int array[x][y]) 
{ 
    for (size_t i = 0; i < x; ++i) 
    { 
    for (size_t j = 0; j < y; ++j) 
    { 
     printf("%d ", array[i][j]); 
    } 
    printf("\n"); 
    } 
} 


int main (void) 
{ 
    size_t x = 5; 
    size_t y = 3; 

    int (*arr_2D)[y]; 

    arr_2D = create_2D_array(x, y); 

    print_2D_array(x, y, arr_2D); 

    free(arr_2D); 

    return 0; 
} 
+1

當我嘗試使用您的版本時,它會說: size_t y表達式必須具有常數值。所以你不能像這樣動態地創建數組(如我所說...) – Marcin

+1

@Marcin我編譯並測試了這段代碼。你必須使用1999年之後編譯的編譯器(爲什麼不?)。例如GCC。您可以通過編譯器選項'gcc -std = c11 -pedantic-errors'告訴GCC是一個C編譯器。 – Lundin

+0

我今天呆了整整一天,想不通。從你的例子接縫工作,但我無法弄清楚這一點。如果我通過函數print2DArray(xDim,yDim,arr)打印表格;'我得到所有元素,所以它工作正常。如果我打印一個像這樣的'printf(「%d \ n」,arr [0] [0])'',那很好。但是,如果我這樣打印'printf(「%d \ n」,old [1] [1]);'或其他任何不同於0的值,都會出現分段錯誤。請幫幫我。 – Marcin