C == Frust
Geizhals » Forum » Programmierung » C == Frust (65 Beiträge, 154 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
........
Re(8): C == Frust
Fly
30.10.2001, 23:21:56
Erh... fang' ma oben an.

char *wort;

Macht im Prinzip NUR (!) folgendes: Es wird ein Stück Speicher genommen, das gross genug ist, damit man damit 'ne Speicherstelle genau bezeichnen kann, und das Stück bekommt den Namen "wort".

MEHR NICHT!

Da wird nix initialisiert, da wird kein Array angelegt, da passiert mal gar nix ausser dass (je nach Architektur) ein paar Byte 'nen Namen bekommen. Da wird nicht mal was reingeschrieben, oder diese Byte gelöscht (daher vorisicht, keinen Pointer verwenden bevor er 'nen Wert bekommen hat!).

Sagen wir mal, wir haben einen Speicher, der insgesamt 64kb verwalten kann (65535 oder 2^16 byte). Demnach muss so'n Zeiger 2 Byte gross sein, damit er jede diese 2^16 Adressen bezeichnen kann. Wenn der Compiler jetzt auf

char *wort;

trifft, sucht er sich irgendwo im Speicher 2 Byte (sagen wir mal, er nimmt Speicherzellen 810 und 811), reserviert diese und gibt ihnen den Namen "wort". Da kann jetzt durchaus irgendein Datenmüll drinnenstehen.

Um jetzt diesen Pointer "sinnvoll" nutzen zu können, muss er auf "nutzbaren" Speicherplatz zeigen. Dazu müssen wir dem Compiler mal klar machen, dass wir Speicherplatz brauchen, und dass dieser Pointer dorthin zeigen soll. Vorläufig tut er das nämlich nicht, vorläufig isses schlicht ein Vektor, von dem der Compiler lediglich weiss dass an seinem Ende ein Byte steht, dass er auch als einzelnes Byte interpretieren soll (wäre dies ein int-pointer würde er, je nach Architektur des Prozessors, das Byte auf das gezeigt wird und das darauf folgende beachten, weil Integer 2 Byte lang ist).

Also muss der Compiler (mit malloc) Speicher reservieren. Und DIESEN Speicher kannst Du dann, über den Pointer, nutzen. Sagen wir, wir reservieren 5 Byte, diese liegen in Speicherzellen 1000 bis 1004. Dann enthalten die Bytes 810 und 811 zusammen den Wert 1000 (den Anfang unseres "wortes"), und der Computer weiss, dass er die Speicherzellen 1000 bis 1004 ab sofort nicht mehr für anderen Krempel gebrauchen darf, bis Du ihn wieder frei gibst (und das solltest Du tun, vor allem in Windows!).

Auch 1000 bis 1004 enthalten ggf. Datenmüll, C initialisiert nicht!

Dies beantwortet hoffentlich Fragen 1 und 2. Du hast kein Array mit einem Pointer. Er stellt "so was ähnliches" dar, ist aber keines. Was ein Pointer (nach malloc) tut ist, auf den Anfang eines bestimmten Speicherbereiches zu zeigen.

Entsprechend kann man mit Pointern auch sehr schön auf Teilelemente dieses Speichers zugreifen, weil wort + i auf das i-te Element nach dem ersten zeigt. Also wort + 1 ist der 2. Buchstabe, wort + 2 ist der 3. usw.

Den Pointer auf das erste Element solltest dabei allerdings nicht verschieben (oder zumindest solltest einen verlässlichen Weg "zurück" haben), weil Du sonst Probleme beim Freigeben des Speichers bekommen wirst.


Shadows can be made real
if you kill in their name.

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung