Arrays und konstante Zeiger



  • Hi,

    nur ne kurze banale Frage:
    Wenn ich ein Array folgendermaßen deklarierer / initialisiere:

    char text[15] = "Hallo Welt";
    

    Dann kann ich text als konstanten Zeiger auf den String betrachten. Wird dieser Zeiger beim linken einfach als statische / konstanter Wert in den Code gelinkt, oder gibt es hinterher im Speicher eine Stelle, an der dieser konstante Zeige zu finden ist?
    Ich hoffe es ist klar geworden, was ich meine, wenn nicht muss ichs nochmal anders formulieren...

    Danke schon mal,

    Cheebi



  • hängt vom compiler ab



  • Cheebi schrieb:

    Dann kann ich text als konstanten Zeiger auf den String betrachten.

    ja

    Cheebi schrieb:

    Wird dieser Zeiger beim linken einfach als statische / konstanter Wert in den Code gelinkt?

    ja.
    In "code segment" oder "code sektion" wird die addresse von "text"
    direkt in die "instruktion"(z.B. mov ax, text)
    kodiert, deshalb konstanter Zeiger weil der "code segment"
    zu Laufzeit nicht verändert werden darf.



  • Was meinst du mit Linken?

    Also wenn du denkst, das Array werde automatisch zu einem Literal umgewandelt, dann liegst du falsch. Du kannst ja zur Laufzeit die Adresse des Objekts abfragen (String-Literale erhalten übrigens auch eigenen Speicherplatz).
    Es muss auch nicht sein, dass es in einen ReadOnly-Bereich gerät. Konstante Variablen (mit const ) sind ja meistens auch änderbar.

    Falls du meinst, wo der Speicher für das Array angefordert wird, so ist das auf dem Stack, wenn es in einer Funktion deklariert wurde, und im Globalspeicher, wenn es global oder statisch deklariert wurde (auf dem Heap, wenn es Teil eines dynamisch allokierten Objekts ist).

    Und ein Array ist kein konstanter Zeiger, auch wenn es sich in gewissen Situationen so verhält.


  • Administrator

    Nein, text ist kein Zeiger und auch nicht in irgendeiner Form konstant! text ist ein Array mit 15 Stellen, welches einen Wert für die ersten 11 Stellen bekommt (inklusive '\0').

    Vielleicht solltest du mal diesen Post von camper lesen:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1570587.html#1570587
    Oder vielleicht sogar den ganzen Thread.

    Und hier hast du auch noch einen Thread:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-220429.html

    Grüssli



  • Ramsis schrieb:

    Cheebi schrieb:

    Wird dieser Zeiger beim linken einfach als statische / konstanter Wert in den Code gelinkt?

    ja.
    In "code segment" oder "code sektion" wird die addresse von "text"
    direkt in die "instruktion"(z.B. mov ax, text)
    kodiert, deshalb konstanter Zeiger weil der "code segment"
    zu Laufzeit nicht verändert werden darf.

    das entspricht in etwa der antwort die ich mir vorgestellt habe. Würden Nexus und Dravere dem zustimmen?

    @Nexus: Ich meine nicht, ob es in ein Literal umgewandelt wird. Mit Linken meine ich, wenn der Compiler dann die Labels hat, dann werden doch diese vom Linker in Adressen umgewandelt.

    Angenommen, ich schreibe folgendes:

    char *text1 = "Hallo";
    char text2[6] = "Hallo";
    

    Dann werden bei der ersten Deklaration 6 Byte + 4 Byte Speicher benötigt. 6 Byte für den String "Hallo\0" und 4 Byte für den Pointer text2 (32-Bit-Compiler).

    nexus schrieb:

    Und ein Array ist kein konstanter Zeiger, auch wenn es sich in gewissen Situationen so verhält.

    Ein Array ist kein Zeiger, aber der Name eines Arrays.
    Bei der zweiten Deklaration werden dagegen nur 6 Byte Speicher benötigt, für den String "Hallo\0", aber nicht für einen Pointer, weil dieser direkt in den Befehl "eingearbeitet" wird.

    Ramis schrieb:

    In "code segment" oder "code sektion" wird die addresse von "text"
    direkt in die "instruktion"(z.B. mov ax, text)
    kodiert

    Gruß

    Cheebi


  • Administrator

    Nein, ich stimme Ramsis nicht zu!

    Cheebi schrieb:

    Ein Array ist kein Zeiger, aber der Name eines Arrays.

    NEIN ... (sorry, wollte mal wieder bold benutzen :D)
    Liest dir die Threads durch. Der Name des Arrays ist ein Objekt vom Typ "Array". Dieses Objekt ist nur implizit in einen Zeiger umwandelbar, ist aber definitiv kein Zeiger!

    char const* p = "Test";
    

    p zeigt auf den Speicher des Literals. Deshalb sollte man auch das const verwenden. Denn in diesen Speicher darf man nicht schreiben.

    char a[] = "Test";
    

    Hier hat a einen eigenen Speicher, nämlich auf dem Stack, welchen man anfordert. "Test" ist ein Literal und hat auch einen eigenen Speicher. Der Wert im Speicher des Literals wird hier in das Array a kopiert! Das heisst allerdings auch, dass man in das Array a schreiben darf!

    Den Typ von a, kann man sich in etwa so vorstellen, in C++ Syntax ausgedrückt:

    class Array
    {
    public:
      char& operator [](int i);
    
      operator char*();
    
      // usw.
    };
    

    Grüssli


Anmelden zum Antworten