Forum: Compiler & IDEs AVR (GCC) Speicherabbildung von Arrays


von anonym (Gast)


Lesenswert?

Hallo,

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?

Danke und LG

von Peter II (Gast)


Lesenswert?

anonym schrieb:
> Wo findet man solche Informationen für gewöhnlich?

einfach durch überlegen.

Tipp:
Man kann ein Array auch durch inkrementieren von Pointern durchgehen.

von Dirk B. (dirkb2)


Lesenswert?

Da du statt array[i] auch *(array+i) schreiben kannst, sollte das 
eigentlich klar sein.

Bei mehrdimensionalen Arrays iteriert der letzte Index am schnellsten.

von anonym (Gast)


Lesenswert?

Peter II schrieb:

> einfach durch überlegen.
>
> Tipp:
> Man kann ein Array auch durch inkrementieren von Pointern durchgehen.

Das kann man erst, wenn man weiß wie das Array im Speicher liegt.

von Dirk B. (dirkb2)


Lesenswert?

anonym schrieb:
> Wo findet man solche Informationen für gewöhnlich?

In einem guten Buch über C.

Das Problem wird sein, das gute Buch zu finden.
Aber im K&R (auch wenn der ziemlich alt ist) steht das drin.

von Peter II (Gast)


Lesenswert?

anonym schrieb:
> Das kann man erst, wenn man weiß wie das Array im Speicher liegt.

ich kann das auch ohne
1
char text[] = "test";
2
3
if ( text[2] == 's'  ) {
4
}

von foo (Gast)


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

von Dirk B. (dirkb2)


Lesenswert?

foo schrieb:
> Damit kommst du
> also auch nicht weiter

Dann mach den Vergleich in einer Funktion.
Da ist die Größe des Arrays unbekannt und somit sollte es unmöglich 
sein, den kleinsten Index ans Ende zu packen.

von Axel S. (a-za-z0-9)


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.

von (prx) A. K. (prx)


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. ;-)

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.