Wie Sie dynamisch reserviert einen zusammenhängenden block von Speicher für ein 2D-array
Wenn ich das zuordnen eines 2D-array wie folgt int a[N][N]; Sie weisen einen zusammenhängenden block von Speicher.
Aber wenn ich versuchen, es zu tun dynamisch wie diese :
int **a = malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++)
a[i] = malloc(cols * sizeof(int));
Dieser verwaltet eine Einheit stride zwischen den Elementen in den Zeilen, aber dies kann nicht der Fall sein, zwischen den Zeilen.
One-Lösung ist die Konvertierung von 2D-zu-1D, außerdem gibt es einen anderen Weg, es zu tun?
Oh, und bitte, bitte, bitte nicht umgewandelt den Rückgabewert von
Mein Fehler, ich kopiere den code von c++ - thread xD
malloc()
.Mein Fehler, ich kopiere den code von c++ - thread xD
InformationsquelleAutor dreamcrash | 2012-11-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr array-Dimensionen zur Kompilierzeit bekannt:
Wenn Ihr array-Dimensionen zur Kompilierzeit nicht bekannt, und Sie sind mit einen C99-compiler oder ein C2011-compiler, unterstützt variable length arrays:
Wenn Ihr array-Dimensionen zur Kompilierzeit nicht bekannt, und Sie sind nicht Verwendung eines C99-compiler oder ein C2011-compiler, unterstützt variable-length-arrays:
Nette Antwort, vielen Dank für die Beantwortung.
Da der Benutzer mit der akzeptierten Antwort war löschen, tausche ich diese.
Wie würde ich mich übergeben, array an eine Funktion, oder zurück von einem? Ruft der compiler, was ist ein 'int(*)[cols]'.
im ersten Fall, der Prototyp wäre so etwas wie
T foo( int (*arr)[COLS], size_t rows)
woCOLS
wird fest zur compile-Zeit (d.h. die Funktion kann nur auf arrays mitCOLS
Spalten). Im zweiten Fall, der Prototyp wäre so etwas wieT foo( size_t cols, int (*arr)[cols], size_t rows)
.cols
müssen deklariert werden, bevor Sie verwendet werden können in der Erklärung zurarr
. Im letzten Fall, der Prototyp wäreT foo( int *arr, size_t rows, size_t cols)
.InformationsquelleAutor John Bode
In der Tat, n-dimensionale arrays (auf dem Stapel reserviert) sind wirklich nur 1-dimensionale Vektoren. Die mehrfache Indizierung ist nur syntaktischer Zucker. Aber Sie können schreiben, eine accessor-Funktion zu emulieren, so etwas wie das, was Sie wollen:
Allerdings, wenn Sie C99 unterstützen, dann deklarieren Sie einen Zeiger auf ein array ist möglich, und Sie können sogar den syntaktischen Zucker:
InformationsquelleAutor
Sagen, Sie wollen die dynamische Zuordnung ein 2-dimensionales integer array of ROWS Zeilen und COLS Spalten. Dann können Sie erst zuordnen, eine kontinuierliche Stück ROWS * COLS Ganzzahlen und dann manuell aufteilen in ZEILEN Zeilen. Ohne syntaktischen Zucker, das liest sich
werden kann und effizienter durch die Vermeidung der Multiplikation,
Schließlich könnte man geben, bis der zusätzliche Zeiger insgesamt
aber es ist ein wichtiger PUNKT! Sie würde vorsichtig sein müssen, um die ersten deallocate A[0] und dann Ein,
Die gleiche Idee kann erweitert werden, um 3 - oder höher-dimensionale arrays, obwohl der code chaotisch.
Ich bin auch daran interessiert, wie diese generalisierten 3D!
InformationsquelleAutor Matei Tene
Können Sie behandeln, die dynamisch zugewiesenen Speicher als ein array von einem alle dimension durch den Zugriff auf Sie in Schritten:
sizeof(*a)
, richtig?Du meinst
sizeof *a
? Manchmal mache ich das, aber es hängt von der phase des Mondes...InformationsquelleAutor Kerrek SB
Entschuldigen Sie meine mangelnde Formatierung oder ein Fehler, aber das ist von einem Handy.
Ich auch festgestellt Fortschritte, wo ich versuchte zu verwenden, fwrite (), um die Ausgabe über die int** - variable, wie die src-Adresse.
War eine Lösung, um den Einsatz von zwei malloc () - Aufrufe:
InformationsquelleAutor Skullquake
Können Sie typedef array (weniger headake) und dann so etwas machen:
InformationsquelleAutor pbhd
Die besten reservieren Sie einen Zeiger auf ein array,
Wenn der compiler nicht unterstützt variable length arrays, das funktioniert nur, wenn
cols
ist ein konstanter Ausdruck (aber dann sollten Sie aktualisieren Sie Ihren compiler sowieso).InformationsquelleAutor Daniel Fischer