2016-06-08 5 views
2

Ich versuche, ein 2D-Array zugewiesen. Ich sehe eine Menge Leute benutzen Schleifen, wenn sie zugewiesen (Dynamically allocated 2d array), aber ich bin immer noch unsicher, ob eine Person immer eine Schleife verwenden muss, um ein 2d-Array in C zuzuordnen. Benötige ich die Schleife, weil mein Code nur eine zuweist Säule?Müssen 2D-Arrays immer eine Schleife für die Zuweisung benötigen?

int ** allocate(int width, int height){ 
    int **array = malloc(sizeof(int *) * width); 
    array[i] = malloc(sizeof(int) * height); 
    return array; 

} 
+0

Nun, zuerst brauchen Sie ein 'i' erklärt ... irgendwo. – WhozCraig

+1

@KerrekSB Lustig, dachte ich, dass er kein 2D-Array (ein Array von Arrays) hat, sondern ein Array von * Pointers *. Kartoffel Kartoffel. – WhozCraig

+0

es ist eher wie ein Baum der 1. Ebene – Cherubim

Antwort

1

Es gibt zwei verschiedene gemeinsame Wege einen 2D-Array in C erstellen Wenn die innere Dimension (dh bekannt bei der Kompilierung) festgelegt ist, können Sie es als ein Array von dieser mit fester Größe Arrays deklarieren, und dann einfach einen großen Speicherblock zuweisen. Wenn Sie dies nicht tun, müssen Sie den Zeilen ein Array von Zeigern zuweisen und dann jede Zeile mit einer Schleife belegen.

5

Nein, Sie brauchen nicht immer eine Schleife.

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

Der Code erklärt oben array als ein Zeiger auf ein Feld von M -Glied int, dann genügend Platz für N Instanzen dieses Array-Typ zuordnet, us Speicher geben für eine N durch M Array von int.

Wenn die Größe der M nicht zur Kompilierzeit bekannt ist, dann ist ein arrayvariabler Länge Array, die nicht in C89 oder früher unterstützt wird.

+1

Es ist anzumerken, dass ein solches 2D-Array innerhalb einer durchgehenden Speicherstelle platziert werden soll, was bei der "Heap Fragmentierung" -Methode nicht der Fall ist. –

+0

Randnotiz: Dies wird immer quadratische Arrays machen. Wenn Sie "gezackte" Arrays verwenden möchten (z. B. die erste Zeile als 5 Spalten, die zweite Zeile als 3 Spalten usw.), können Sie dies mit expliziten mallocs in jeder Zeile tun – ellman121

0

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!