Maak een 2D-array in C

Elke keer dat ik het geheugen toewijs voor een 2D-array, maak ik eerst een array van int**en vervolgens met een for wijs ik het geheugen toe voor elk element.

Bijvoorbeeld:

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

Zou niet mogelijk zijn om het geheugen toe te wijzen zoals:

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

of

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

om de forte vermijden?


Antwoord 1, autoriteit 100%

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

arrverwijst naar int[M].

gebruik zoals arr[0][M-1];

en free(arr);


Antwoord 2, autoriteit 100%

int ** arr = malloc(N*sizeof(int[M]));is gewoon een onjuiste C-code, als je deze simuleert door eenmaal als volgt toe te wijzen:

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

Voeg toegang toe via arr[i*M + j], dit is analoog aan toegang tot arr[I][j]in je eerste geval.


Antwoord 3, autoriteit 32%

Je hebt een “wijzer naar aanwijzer”. Dat kan geen 2D-array vertegenwoordigen.

De juiste declaratie van een pointer naar een 2D-array is

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

Dat maakt arrayeen pointer naar een array van COLSints. Het type is `int (*)[COLS], btw. maar je hebt het type niet nodig, zie hieronder.

Om de array toe te wijzen, moet u de standaardtoewijzing voor een 1D-array gebruiken:

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

Welke variant je moet gebruiken, is je persoonlijke stijl. Hoewel de eerste geen redundantie bevat (denk eraan dat u de declaratie van arraywijzigt om INNERte gebruiken in plaats van COLSof het elementtype in float). De tweede is op het eerste gezicht duidelijker, maar vatbaarder voor fouten bij het wijzigen van de declaratie van array.

Om free:

free(array);

Other episodes