Wie, um dynamische Zuweisung ein zwei-dimensionales array
Ich würde gerne ein zwei dimensionalen array in C.
Zum Beispiel, ich mache einen int-Typ ist die variable Ort wie diesem:
int *place;
Ich habe ein Spiel, welches die Variablen haben, wie Zeilen und Spalten.
Ich möchte meinen Platz Variablen, ein zweidimensionales array ist, mit der dynamischen Zuordnung von Zeilen und Spalten (für die max Größe des Arrays), die Aussehen würde, wie dies in der "normalen" Erklärung:
place[rows][columns];
aber ich weiß nicht, wie es mit der dynamischen Zuordnung.
Ich würde es tun, wie dies bei eindimensionalen arrays:
place = (int*) malloc (levels * sizeof(int));
aber ich weiß nicht, wie dies mit 2D-arrays.
Edit:
Wie kann ich diese umschreiben für char statt int?
Habe ich versucht, einfach überschreiben die int-Werte mit den chars, aber es funktioniert nicht.
- Können Sie zeigen, was Sie versuchte, es zu benutzen für
char
s und sagen, wie es nicht funktioniert hat? Alle Antworten arbeiten unabhängig von der Basis-Typ, Sie müssen nur ersetzen Sie den Typ-Namen in die entsprechenden Orte. - Ich habe eine variable wie diese: char Ort; dann: (*place)[Spalten] = malloc(rows * sizeof *Ort); aber es funktioniert nicht, sagen conflicting types for Ort
- Nein, die syntax (zugegeben, keine gute syntax, IMO) ist
char (*place)[columns];
zu erklärenplace
als Zeiger auf arrays voncolumns
char
s, einchar (*)[columns]
. Sie können wie gewohnt initialisieren unverzüglich nach der Erklärungchar (*place)[columns] = malloc(rows * sizeof *place);
. - Ich habe es versucht, nun ist es zu sagen, dass element-Initialisierer ist nicht konstant. Ich habe versucht, die Zeilen und Spalten Konstanten, aber es ist nicht gut, weder.
- Wenn es sich beschwert, dass die initialiser ist nicht konstant, das bedeutet, dass ein Objekt hat statische Speicher Dauer. Das ändert die Dinge. a) statische Objekte müssen Konstante Ausdrücke für initialisers, b) statische Objekte können nicht variabel modifizierten Arten. Wenn
columns
kann ein konstanter Ausdruck sein, können Sie noch erklärenchar (*place)[columns];
, und 1. wenn es im Datei-Bereich,malloc
immain
, 2. wenn es hat die Funktion, den Geltungsbereich, die haben eine statische guard-variable undmalloc
beim Aufruf der Funktion wird zuerst aufgerufen. Wenn beiderows
undcolumns
werden kann Konstante Ausdrücke verwendenchar place[rows][columns];
. - Sie benötigen
place
statische Speicher Dauer? (Für einen pointer, das ist eher sinnlos.) - Ich habe eine Funktion, welche die gleichen Variablen. Ich nicht genau weiß, wie kann ich Ihnen übergeben zwischen Funktionen zu haben, da einige dieser Funktionen haben keine return-Wert.
- Wenn eine dieser Funktionen aufruft, anderen, kann es ohne Probleme übergeben Sie das array als argument, wenn es empfangen, der es sich als einer. Deklarieren Sie es in die top-level-Anrufer, und übergeben Sie Sie als argument an, welche Funktionen muss das array.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen
place
ein Zeiger auf arrays,Gibt Sie einen zusammenhängenden block von Speicher (gut für die Treffsicherheit), dass Sie einfach den Zugang mit
*place
wäre eine große Hilfe für visuell.int (*)[columns]
ein Zeiger auf ein array voncolumns
int
s. Dann reservieren von Arbeitsspeicher fürrows
Objekte des Typsplace
Punkte zu.columns
ganze zahlen), sosizeof *place == columns * sizeof(int)
, damit Sie insgesamt reservierenrows*columns*sizeof(int)
bytes.*place
wirdplace[0]
ist, ein array voncolumns
int
.**place
erhalten Sieplace[0][0]
.Könnte man eine einzelne 1d-array ein 2d-array, indem Sie einige intelligente Indizierung :
Speicher :
Zugang
place[i][j]
verwenden Sie i und j als :Müssen Sie die folgenden zuordnen arr[x][y] Typ int dynamisch:
Die Idee ist, erstellen Sie zuerst ein ein-dimensionales array von Zeigern, und dann für jeden array-Eintrag, erstellen Sie eine weitere ein-dimensionales array.