Mehrdimensionales Dynamisches Array alloziieren
-
Hallo,
Ich hab da so ein kleines Problem Undzwar versuche ich ein 2dimensionales Array zu erzeugen undzwar so:void ClearTempTile(long MapNum) { int y; int x; // initialize the dynamic array // allocate memory TempTile[MapNum].DoorOpen = malloc(Map[MapNum].MaxX+1); for (x = 0; x <= Map[MapNum].MaxX; x++) TempTile[MapNum].DoorOpen[x] = malloc(Map[MapNum].MaxY+1); printf("Size: %d\n", (int)sizeof(TempTile[MapNum].DoorOpen[15][12])); for (x = 0; x <= Map[MapNum].MaxX; x++) { for (y = 0; y <= Map[MapNum].MaxY; y++) { printf("Map[%d][%d]\n", x, y); TempTile[MapNum].DoorOpen[x][y] = (unsigned char)NO; } } TempTile[MapNum].DoorTimer = 0; }
Legende:
TempTile[] ist ein array eines structs
NO ist 0 (wird beim #define als int initialisiert daher der cast)struct TempTileRec { unsigned char **DoorOpen; long DoorTimer; } __attribute__((__packed__));
Alloc funktioniert soweit, die werte stimmen auch (MaxX = 14; MaxY = 11).
Das Programm bricht aber ab hier ab:
Map[5][11]
Map[6][0]
Segmentation faultKann jemand meinen Denkfehler finden?
-
Schlechter Code, globale Variablen, hast du schon mal was von Zeigern auf Strukturen gehört?
Es sollte besser gehen mit:void ClearTempTile(/*struct */ TempTile *tf)
und dann einfach
tf->DoorOpen = ...
statt
TempTile[MapNum].DoorOpen = ...
Mind. 1 Fehler ist: du allokierst zu wenig Speicher für die DoorOpen-Zeiger
TempTile[MapNum].DoorOpen = malloc(Map[MapNum].MaxX+1); for (x = 0; x <= Map[MapNum].MaxX; x++) TempTile[MapNum].DoorOpen[x]
Das könnte in etwa so aussehen:
TempTile[MapNum].DoorOpen = malloc((Map[MapNum].MaxX+1)*sizeof(TempTile[MapNum].DoorOpen[0]));
oder kürzer
TempTile[MapNum].DoorOpen = malloc((Map[MapNum].MaxX+1)*sizeof(int*));
oder kürzer
tf->DoorOpen = malloc((tf->MaxX+1)*sizeof*tf->DoorOpen);
oder kürzer
tf->DoorOpen = malloc((tf->MaxX+1)*sizeof tf);
-
Danke Wutz.
Das mit dem Pointersize hab ich vergessen.
Und in der Tat habe ich sowas noch nicht gesehen / davon gehört.
Ich fang erst grad an mit c zu programmieren, das was vollkommen anderes als Delphi. So langsam raff ich wie c arbeitet.