C Verständnisfrage char array pointer

Status
Für weitere Antworten geschlossen.

elektro2

Cadet 4th Year
Registriert
Feb. 2014
Beiträge
67
Hallo zusammen :)

Ich habe mir mal ein paar Fragen zur folgenden Code-Zeile gestellt.

Code:
char *p="Hallo Welt ";

Ich wollte Fragen, was genau der Compiler in diesem Fall macht. Ein Pointer zeigt ja immer auf eine Adresse.

Oder man könnte mit char *p=malloc(20); 20 bit speicher für ein Wort schaffen.
Aber wie arbeitet der compiler in diesem Beispiel? Sucht der sich irgendeine Anfangsadresse und belegt die weitern 9
mit den Buchstaben h,a,l,l..............??

Und was ist mit der binären Null??

Danke für eure Antworten :)
 
Ja er legt einen Speicherbereich an. Entweder auf dem Stack wenn es eine lokale Variable ist, oder normal im Speicher wenn es eine globale ist.
Der Speicherbereich ist so groß wie der String plus endende Null. Wenn du später Mist baust, kannst du ohne weiteres über den angelegten Speicherbereich hinausschreiben mit deinem Pointer und großes Unheil anrichten.

Mit malloc hat das überhaupt gar nichts zu tun, und malloc legt auch eine Anzahl Bytes, nicht Bits an.
 
Die Antwort von HominiLupus ist falsch.

Das Binary, das der Compiler ausspuckt (unter Windows "Die .exe") besteht aus mehreren Sektionen. Unter Anderem einer Sektion mit ausführbarem Code und einer mit Daten.
In der Datensektion liegen Konstanten, die zur Zeit der Kompilierung feststehen. Zum Beispiel Tabellen, aber auch dein String da. Der Zeiger wird dann so initialisiert, dass er auf
die Datensektion des Binaries im Speicher zeigt.
 
Es gibt zu dem was asdfman angesprochen hat einen super Artikel hier: An In-Depth Look into the Win32 Portable Executable File Format
Wird dir zwar etwas zu hoch sein, aber kannst es ja mal lesen.

Was für dich erstmal relevant beim Programmieren ( lernen ) ist, ist dass String Literale als const char* im Speicher liegen und du sie auch als solche behandeln sollst. Das heißt "const char* p = "Hello World!;", damit du nicht schreibend deinen Pointer verwendest.

Gruß
BlackMark
 
Er wählt einen freien Speicherbereich. Der erste Block wird zum Pointer, hinten dran schreibt er die Zahlen gemäß der Zeichentabelle um Buchstaben zu repräsentieren, ganz hinten kommt ein Terminal Symbol "\0" wo der Lese Stop erfolgt.

Zugriffe auf den Pointer lesen also ab dem Speicherbereich wo der Pointer hinzeigt, bis zum \0
Wenn du die \0 überschreibst, dann neu ausliest...tja, dann siehst deinen String + weiteren Mist, je nachdem wo die nächste \0 ist ;)
 
Zuletzt bearbeitet:
Warum kommen immer noch Leute, die wirren sinnlosen Kram erzählen, wenn die richtige Antwort schon da steht?
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben