definiert ein 2D-Array mit malloc und modifiziert es

8

Wie definiere ich ein 2D-Array mit malloc? (sagen wir 10X20).

Zweitens, kann ich die Anzahl der Zeilen oder Spalten erhöhen, ohne ein neues vergrößertes Array zu erstellen und alle Daten darauf zu kopieren?

zum Beispiel, wie ordne ich Speicher zu, so dass das Array 10x30 oder 15x20 sein wird?

Danke!

    
Asher Saban 27.08.2010, 13:40
quelle

6 Antworten

9

10x30:

%Vor%

15x20:

%Vor%

Skalierung auf 20x25:

%Vor%

Die äußere Dimension (10, 15, 20) kann zur Laufzeit bestimmt werden, da sie nicht als Teil von Indexberechnungen durch den Compiler benötigt wird. Die innere Dimension (30, 20, 25) muss zur Kompilierzeit bekannt sein. Ich hoffe es hilft.

Beachten Sie, dass diese Lösung im Gegensatz zu den array-of-pointer-Lösungen als einzelner Speicherblock behandelt werden kann, da sie alles in einem einzelnen Speicherbereich wie ein real deklariertes Array zuordnet:

%Vor%

Es hängt jedoch letztendlich von Ihrem Anwendungsfall ab.

Da einige Leute Schwierigkeiten haben, die von einer Indexoperation an array durchgeführten Aktionen zu verstehen, lassen Sie uns Clang einen Indexausdruck im folgenden Code geben

%Vor%

Es ist ein netter Compiler, der seinen AST leicht lesbar ausdrucken kann

%Vor%

Beachten Sie, dass jeder Array-Indexausdruck einen Zeiger annimmt, den Wert des Index hinzufügt und das adressierte Element liefert. Wenn dieses Unterelement ein Array ist, wird es zu einem Zeiger auf sein erstes Element zerfallen. Dies ist wirklich nicht anders als die Schritte für ein deklariertes Array

%Vor%

Ergibt einen sehr ähnlichen AST, wobei nur der innerste Ausdruck zuerst zu einem Zeiger auf sein erstes Element zerfallen ist

%Vor%     
Johannes Schaub - litb 27.08.2010, 14:05
quelle
5

Während malloc() nicht direkt mehrdimensionale Arrays unterstützt, gibt es Workarounds wie:

%Vor%

Obwohl dies nicht direkt ein 2D-Array ist, funktioniert es, und meiner Meinung nach ist es das einfachste. Wenn Sie stattdessen die Syntax [][] verwenden möchten, müssen Sie Zeiger auf Zeiger setzen, zum Beispiel:

%Vor%     
Frxstrem 27.08.2010 13:51
quelle
3
%Vor%

Um die Größe der Matrix zu erhöhen, können Sie realloc verwenden, obwohl es wahrscheinlich einfacher wäre, die Matrix unterschiedlicher Größe neu zu erstellen und die Werte zu kopieren.

    
Luca Matteis 27.08.2010 13:47
quelle
0
  

Zweitens, kann ich die Anzahl der Zeilen erhöhen   oder cols, ohne ein neues zu erstellen   Array erhöht und alle Daten kopiert   dazu?

Nein, Sie können die Größe eines Arrays nicht ändern. Was Sie tun können, ist Zeiger und realloc zu tun, um dies zu tun.

    
Tom 27.08.2010 13:46
quelle
0

Ein 2D-Array ist ein 1D-Array von 1D-Arrays. Da ein Array einfach ein Zeiger ist, ist ein Array von Arrays ein Array von Zeigern. Daher verwenden Sie malloc , um ein Array von Zeigern zuzuordnen (die jeweils eine Spalte darstellen), und verwenden Sie sie dann erneut, um die einzelnen Arrays zuzuordnen (die jeweils eine Zeile darstellen).

Um das Array zu erweitern / verkleinern, verwenden Sie realloc (Referenz) . Hier ist ein Beispielcode:

%Vor%

Es tut mir leid, wenn ich etwas falsch gemacht habe. Mein C-Fu ist irgendwie rostig:)

    
PaoloVictor 27.08.2010 14:02
quelle
0

Anstatt int[row][col] zu verwenden, sollten Sie Ihre Matrix besser in ein eindimensionales Array int[row*col] einfügen.

Hier ist ein Beispielcode:

%Vor%

Wenn die Neuzuweisung ein Problem darstellt, können Probleme auftreten. Und Sie sollten die bi-dimensionale Version verwenden.

    
Andrei Ciobanu 27.08.2010 16:53
quelle

Tags und Links