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 fault

    Kann 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.


Anmelden zum Antworten