c und zweidimensionale arrary im speicher

Gast #478929
Lesenswert?

hi,

ich will dynamisch ein zweidimensionales feld anlegen dessen größe 
ebenfalls dynamisch ist (also erst zur laufzeit bekannt).

bisher war ich immer der meinung das bei einem zweidimensionalen feld 
sie spalen als ganzes hintereinander weg im speicher liegen, durch das 
anlegen mit z b feld[3][3] weiß der compiler beim zugriff welchen offset 
er addieren muss um ins "richtige" feld zu treffen.

meine frage, was genau wird aus der konstruktion feld[x][y] beim 
übersetzen!ß das muss sich doch auch in c ausdrücken lassen, oder!?

ich hoffe mein problem ist verständlich...da müsste etwas mit zeiger auf 
zeiger passieren, oder!?

d.
Gast #479087
Lesenswert?

Hallo,

bei einem 2 Dimensionalen Array wird in der ersten Stufen ein Array von 
Zeigern auf die einzelnen Datenarrays  angelegt

ich versuche das mal zu zeichnen:

Zeigrearay       Darenaray

->                 []

->                 []

->                 []


wenn dann musst du also

zuerst ein Array mit zeigen auf Arrays anlegen und anschließend die 
einzelnen Datenarrays

Grüße

Tom
#479125
Lesenswert?

> bei einem 2 Dimensionalen Array wird in der ersten Stufen
> ein Array von Zeigern auf die einzelnen Datenarrays  angelegt

Nur dann, wenn es sich um ein selbst erstelltes dynamisches
Array handelt.
Wenn du ein statisches 2D-Array erzeugst, dann generiert
der Compiler keine verzeigerte Struktur!

int main()
{
  // das hier ist kein verzeigertes Gebilde!
  // die einzelnen Elemente liegen direkt hintereinander im
  // Speicher.
  //
  int check[4][5];
}

Gast #479604
Lesenswert?

hi,

danke für die antworten, das ganze hat sich auch für mich so bestätigt.

bei einem 2 dim stitischen array liegt keine zeigerstruktur auf 
eindimensionale felder dahinter, anders bei dyn 2d arrays: hier wird ein 
zeigerfeld angelegt und anschließend auf 1d arrays verwiesen.

sie lassen sich später in c gleich behandeln:

array[0][1]=5;   // wenn array zb ein int array ist...

hier noch ein kleines bsp.:

#define DIMX 2
#define DIMX 3

voif function(void)
{
  int  x[DIMX][DIMY];
  int  **y;
  int i;

  y=(int**)malloc(DIMX*sizeof(int*);
  for (i=0; i<DIMX; i++)
  {
    y[i] =(int*) malloc(sizeof(int) * DIMY);
  }
}

x ist hier statisch, y dynamisch

dank euch,
dennis

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren