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



所以我阅读了几十个将二维数组指针传递给函数的示例,以获取/更改函数中该数组的值。但是是否可以在函数内部创建(分配内存)。像这样:

#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("%dn", 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;
        }
    }    
}

忘记指针到指针。它们与 2D 数组无关。

如何正确操作:如何在 C 中正确设置、访问和释放多维数组?

使用指针到指针是错误的众多原因之一:为什么我需要使用 type** 来指向 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;
}

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新