Siehe zum Beispiel How do I allocate a 2 D array with contigious memory ? How Do I use it to access rows and columns? Give me an example
Wenn das, was vermieden werden soll, die mehrere Anrufe zu malloc()
ist, dann ist hier eine alternative Möglichkeit, einen 2D-Array zugeordnet werden:
int row=42;
int col=35;
int** array=malloc(row*sizeof(int*));
if(array==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
array[0]=malloc(row*col*sizeof(int));
if(array[0]==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
int i;
for(i=1;i<row;i++){
array[i]=&array[0][i*col];
}
...
free(array[0]);
free(array);
Werte können noch sein Retreived von int val=array[i][j]
und array[i][j]=42;
gesetzt
Verglichen mit der Methode, die in Ihrer Frage eingeführt wird, stellt die vorliegende Methode sicher, dass die Zeilen zusammenhängend im Speicher sind. Daher kann ein solches Array von float
oder double
leicht von der LAPACK-Bibliothek als eine Matrix verwendet werden, von der FFTW-Bibliothek zum Berechnen der 2D-Fast-Fourier-Transformation eines Bildes (Faltung ...). Aber die Größe des Arrays im laufenden Betrieb zu erhöhen ist viel schwieriger.
Beachten Sie, dass die Größe des Arrays vom Programm zur Ausführungszeit, Tage nach der Kompilierung des Programms, berechnet werden kann.
Dieser Trick kann auf höhere Dimensionen (3D, 4D, ...) erweitert werden, aber es wird nicht schöner!
Nun, zuerst brauchen Sie ein 'i' erklärt ... irgendwo. – WhozCraig
@KerrekSB Lustig, dachte ich, dass er kein 2D-Array (ein Array von Arrays) hat, sondern ein Array von * Pointers *. Kartoffel Kartoffel. – WhozCraig
es ist eher wie ein Baum der 1. Ebene – Cherubim