Malloc un tableau 2D en C

Chaque fois que j’alloue de la mémoire pour un tableau 2D, je crée d’abord un tableau de int** , puis avec un pour allouer la mémoire de chaque élément.

Par exemple:

 int ** arr = malloc(N*sizeof(int *)); for(i=0; i< N; i++) arr[i] = malloc(M*sizeof(int)); 

Ne serait pas possible d’allouer la mémoire de la manière suivante:

 int ** arr = malloc(N*sizeof(int[M])); 

ou

 int ** arr = malloc(sizeof(int[N][M])); 

afin d’éviter le for ?

comme ceci: int (*arr)[M] = malloc(sizeof(int[N][M]));

arr est un pointeur sur int[M] .

utiliser comme arr[0][M-1];

et free(arr);

int ** arr = malloc(N*sizeof(int[M])); est tout simplement un code C incorrect, si vous le simulez en allouant une fois comme ceci:

 int *arr = malloc(N*M*sizeof(int)); 

Ajoutez un access par arr[i*M + j] , il est analogique pour accéder à arr[I][j] dans votre premier cas.

Vous avez un “pointeur à pointeur”. Cela ne peut pas représenter un tableau 2D.

La déclaration correcte d’un pointeur sur un tableau 2D est

 // number of elements in one row #define COLS 10 // number of rows #define ROWS 20 int (*array)[COLS]; // mind the parenthesis! 

Cela fait array un array un pointeur sur un tableau de COLS int s . Le type est `int (*) [COLS], btw. mais vous n’avez pas besoin du type, voir ci-dessous.

Pour allouer le tableau, vous devez ensuite utiliser l’allocation standard pour un tableau 1D:

 array = malloc(sizeof(*array) * ROWS); // COLS is in the `sizeof` array = malloc(sizeof(int[ROWS][COLS])); // explicit 2D array notation 

La variante à utiliser est le style personnel. Tandis que le premier ne contient aucune redondance (considérez que vous modifiez la déclaration de array pour utiliser INNER au lieu de COLS ou le type d’élément sur float ). La seconde est plus claire au premier abord, mais plus sujette aux erreurs lors de la modification de la déclaration de array .

Pour free :

 free(array);