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 for
te vermijden?
Antwoord 1, autoriteit 100%
zoals dit: int (*arr)[M] = malloc(sizeof(int[N][M]));
arr
verwijst 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 array
een pointer naar een array van COLS
int
s. 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 array
wijzigt om INNER
te gebruiken in plaats van COLS
of 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);