Ein Zeichen in String ersetzen (String Tabelle)



  • Hallo zusammen,
    ich habe folgendes Problem:
    diese Code kompiliere ich fehlerfrei. Aber beim Ausführen an der Zeile 9 und 10 kriege ich diesen Fehler: 0xC0000005: Access Violation.
    Was ist hier falsch?
    Kann jemand mir helfen bitte?
    (Übrigens verwende ich Microsoft Visual C++ 6.0. )
    Mfg

    1 #include <stdio.h>
    2
    3 int main()
    4 {
    5 char *str[] = {"Hans", "Musterman"};
    6 char *p;
    7
    8 p = str[0];
    9 str[0][0] = 'X';
    10 p[0] = 'Y';
    11
    12 return 0;
    13 }



  • Stringkonstanten werden im schreibgeschützten Speicher untergebracht. Du musst deshalb Kopien anlegen. Am einfachsten geht das mit einer anderen Deklaration:

    char str[][10] = {"Hans", "Musterman"};
    


  • Konfusius schrieb:

    Stringkonstanten werden im schreibgeschützten Speicher untergebracht. Du musst deshalb Kopien anlegen. Am einfachsten geht das mit einer anderen Deklaration:

    char str[][10] = {"Hans", "Musterman"};
    

    😃 👍 Supper. Das hat geklappt. Vielen dank.

    Meine Frage ist:
    Wieso ist es als konstant angenommen, verstehe ich nicht?
    Ich habe es aber nicht so definiert:
    const char *str[];



  • Stringkonstanten (der Name sagt ja schon alles) werden immer als const char* interpretiert, auch wenn du sie als char* deklarierst. Du kannst zwar dem Zeiger die Adresse eines neuen Stringliterals zuweisen (sofern dein String kein konstanter Zeiger ist), aber du kannst die enthaltenen Zeichen nicht direkt veraendern.

    Gruss
    Cartman



  • Normalerweise soll ja in Stringkonstanten nicht reingeschrieben werden. Deshalb werden sie vom Compiler im Code-Segment abgelegt, denn das landet bei speichergeschützten Betriebssystemen nach dem laden und starten der Programmdatei in einem Speicherbereich, der hardwaremäßig vor Schreibzugriffen geschützt ist. Das man in Stringkonstanten nicht reinschreiben kann liegt also am Compiler/OS und nicht an C.

    Wenn du char *str[] schreibst, dann bekommst du ein Array von Zeigern auf die Strings. Mit char str[][10]={...} bekommst du ein zweidimensionales Array von chars, das mit den Strings initialisiert wird. Mit const char *str[] ist das Array von Zeigern konstant, nicht aber das worauf die Zeiger zeigen. Du kannst dann zB nicht str[1]="Welt" schreiben, sehr wohl aber str[1][1]='W'.

    C ist eigentlich eine maschinennahe Sprache. Du mußt immer in Bits, Bytes und Speicheraddressen denken; und nicht in Buchstaben, Zeichenketten und Zahlen.


Anmelden zum Antworten