Forum: Mikrocontroller und Digitale Elektronik Speicherbelegung dreidimensionales Array


von ArrayGog (Gast)


Lesenswert?

Hallo,

ich frage mich gerade, in welcher Reihenfolge ein Linearer Speicher 
belegt wird, wenn ich dort ein dreidimensionales Array reinlege.

Soweit ich weiß, sieht das bei einem zweidimensionalen Array wie folgt 
aus:
1
Array[3][6]=
2
{
3
{"Wort1"},
4
{"Word2"},
5
{"Text3"},
6
};
7
8
Speicherbelegung Array:
9
10
W o r t 1 \0 W o r d 2 \0 T e x t \0


Wie sähe das bei einem dreidimensionalen Array aus?

von Mitlesa (Gast)


Lesenswert?

ArrayGog schrieb:
> Wie sähe das bei einem dreidimensionalen Array aus?

Versuch macht Kluch.

Erzeuge dir den entsprechenden Code mit dem Compiler und
schaue dir mit einem Bin-Editor/Viewer das compilierte
Ergebnis an.

von jz23 (Gast)


Lesenswert?

ArrayGog schrieb:
> zweidimensionalen Array

Ist das nicht eigentlich ein verschachteltes Array? Zweidimensionale 
Arrays werden doch mit
1
Type Array[x,y] = {}

initialisiert?

von Hugo (Gast)


Lesenswert?

jz23 schrieb:
> ArrayGog schrieb:
>> zweidimensionalen Array
   ----
>
> Ist das nicht eigentlich ein verschachteltes Array? Zweidimensionale
> Arrays werden doch mit
> Type Array[x,y] = {}
> initialisiert?

ArrayGog schrieb:
> Wie sähe das bei einem dreidimensionalen Array aus?
                         ----

von fop (Gast)


Lesenswert?

Ich würde mal sagen : so wie es dem Programmierer des Compilers in den 
Kram gepasst hat.
Wenn Du nicht nach Jahren/Jahrzehnten mit irgendwelchen ollen Kamellen, 
die Du mal programmiert hast, belästigt werden willst, vertraue 
niemals darauf, wie der Compiler Deine Daten im Speicher ablegt.
Ob Du es glaubst oder nicht, sowas kann sich auch von einer 
Versionsnummer zur anderen eines Compilers ändern.
Unions, Typecasts (gerne auch mal von Zeigern) oder memcpy/memmove 
machen zwar auf den ersten Blick einen schlanken Fuß, schränken aber die 
Portierbarkeit heftigst ein.
Wenn man Daten serialisiert, um sie in's Nvm abzulegen, ist es sehr 
wahrscheinlich, dass haargenau der selbe Mikrokontroller mit der selben 
Software die auch wieder liest und deserialisiert. Wenn man dann noch 
sagt, beim Softwareupdate werden die Nvm-Daten wieder zurück gesetzt, 
weil sich das Layout vermutlich sowieso ändert, dann kann man schon mal 
mit solchen Tricks arbeiten.
Wie so oft muss man also wissen, was man tut...

von Stefan F. (Gast)


Lesenswert?

> Array[3][6]
> Wie sähe das bei einem dreidimensionalen Array aus?

So: Array[2][3][6]

W o r t 1 \0 W o r d 2 \0 T e x t \0W o r t 1 \0 W o r d 2 \0 T e x t \0

Das ist ein Array mit zwei Elementen, welche jeweils ein Array mit 3 
Elementen enthält, welches jeweils ein Array mit 6 Elementen enthält.

Man kann diese Logik beliebig weiter spinnen.

> Ich würde mal sagen : so wie es dem Programmierer des Compilers in
> den Kram gepasst hat.

Ich glaube nicht, daß es da irgendwelche Freiheiten gibt.

> vertraue niemals darauf, wie der Compiler Deine Daten im Speicher ablegt

Es gibt eine klare Regel, wie der Compiler Daten im Speicher ablegt. Und 
die besagt, daß Arrays niemals Füllbytes enthalten (im Gegensatz zu 
Strukturen). Ohne diese Regel würden Zeichenketten nicht funktionieren.

Darauf kannst du dich verlassen. Du kannst dich auch darauf verlassen, 
daß das Inkrementieren eines char* immer auf das nächste Zeichen zeigt. 
Ganz egal, wie groß der Pointer selbst ist und wie die Zeichen im 
Speicher abgelegt werden.

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.