AVR (GCC) Speicherabbildung von Arrays

Gast #4141800
Lesenswert?
• ▲
▼
Peter II schrieb:
> anonym schrieb:
>> Das kann man erst, wenn man weiß wie das Array im Speicher liegt.
>
> ich kann das auch ohne
> char text[] = "test";
>
> if ( text[2] == 's'  ) {
> }

Wenn man schon davon ausgeht, dass es Sinn machen würde, Arrays 
rückwärts im Speicher abzulegen, könnte man ja auch davon ausgehen, dass 
das selbe für Strings gilt (weil... sind ja Arrays). Damit kommst du 
also auch nicht weiter
#4142787
Lesenswert?
• ▲
▼
anonym schrieb:
> da ich die Info nicht finde: Wie wird ein Array im Speicher abgelegt,
> also liegt zum Beispiel das erste Element an der höchsten Adresse oder
> an der niedrigsten?
>
> Wo findet man solche Informationen für gewöhnlich?

Die Frage ist eher, warum man glaubt diese Information zu benötigen?

Wie Vorredner schon anmerkten, ist innerhalb von C garantiert daß 
Pointer-Arithmetik und Indizierung gleichwwertig genutzt werden können. 
Das sollte im Normalfall alles sein, was man wissen muß.

Andererseits gibt es aber keine Garantie, daß Pointer einfach lineare 
Adressen im Speicher sind. Anders gesagt: wenn ein (void) Pointer x auf 
Adresse X zeigt, dann ist nicht garantiert daß x+1 auf Adresse X+1 
zeigen wird. Genausogut könnten Zeiger den Adreßraum rückwärts 
ansprechen. Oder in Blöcken. Oder beliebig anders. Das ist ein 
Implementierungsdetail des C-Compilers.

In der Praxis läuft es zu 99% darauf hinaus, daß ein Pointer eine ganz 
simple Adresse enthält. Ein Array liegt dann dicht gepackt im Speicher 
mit dem ersten Element an der niedrigsten Adresse.
#4142796
Lesenswert?
• ▲
▼
Die Anordnung im Speicher ist definiert, nur nicht die exakte Sequenz 
der Pointerwerte.

Speicher: "An array type describes a contiguously allocated nonempty set 
of objects with a particular member object type, called the element 
type." und "All objects in C must be representable as a contiguous 
sequence of bytes, each of which is at least 8 bits wide."

Pointer: "Consider a hypothetical segmented architecture on which 
pointers comprise a segment descriptor and an offset. Suppose that 
segments are relatively small so that large arrays are allocated in 
multiple segments. While the segments are valid (allocated, mapped to 
real memory), the hardware, operating system, or C implementation can 
make these multiple segments behave like a single object: pointer 
arithmetic and relational operators use the defined mapping to impose 
the proper order on the elements of the array."

(C99 Reference/Rationale)

Axel Schwenke schrieb:
> Anders gesagt: wenn ein (void) Pointer x auf
> Adresse X zeigt, dann ist nicht garantiert daß x+1 auf Adresse X+1
> zeigen wird.

Da wir grad so schön dabei sind, Häärlein zu spalten: Mit void* kannst 
du nicht rechnen. ;-)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.