通过将指针传递给c中的函数来创建2D数组

所以我读了几十个将2D数组指针传递给函数的例子,以便在函数中获取/更改该数组的值。 但是有可能在函数内部创建(分配内存)。 像这样的东西:

#include  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; } } } 

是的,将指针传递给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); 

忘记指针指针。 它们与2Darrays无关。

如何正确地做到这一点: 如何在C中正确设置,访问和释放多维数组? 。

使用指针到指针是错误的众多原因之一: 为什么我需要使用类型**指向类型*? 。

如何正确完成的示例:

 #include  #include  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; } 

是的,可以通过这种方式初始化数组。 只要传递指针,内存地址应保持不变。 因此,如果您为指针指定任何内容,它将有效。

将a []视为指向第一个元素的*指针

a [] []将是指向第一个元素的指针的**指针或指向第一个数组的指针(表的第一行)