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
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.
Da du statt array[i] auch *(array+i) schreiben kannst, sollte das eigentlich klar sein. Bei mehrdimensionalen Arrays iteriert der letzte Index am schnellsten.
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.
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.
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 | }
|
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.