Speicherbelegung dreidimensionales Array

Gast #5095257
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
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
> 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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.