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

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