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!
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
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% Während malloc()
nicht direkt mehrdimensionale Arrays unterstützt, gibt es Workarounds wie:
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:
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.
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:
Es tut mir leid, wenn ich etwas falsch gemacht habe. Mein C-Fu ist irgendwie rostig:)
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.
Tags und Links c