Forum: Mikrocontroller und Digitale Elektronik c und zweidimensionale arrary im speicher


von Dennis (Gast)


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.

von Dennis (Gast)


Lesenswert?

nach langem suchen ahbe ich es endlich selbst gefunden:

y[a][b] entspricht *(*(y+a)+b)

d.

von Tom_1975AQ (Gast)


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

von Karl heinz B. (kbucheg)


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];
}


von dennis (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.