Speicherbelegung dreidimensionales Array

Gast #5095257
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?
Gast #5096042
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...
Gast #5096151
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.

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