Unterschied zwischen char *c und char c[]



  • Hi

    Kann mir jemand erklaeren, wieso s2[0] undefined behavior erzeugt in folgendem Code:

    int main()
    {
    	char s1[] = "Hello";
    	char *s2 = "Hello";
    
    	printf("%c\n",s1[0]); // Ok
    	printf("%c\n",s2[0]); // Ok
    
    	s1[0] = 'T'; // Ok
    	s2[0] = 'T'; // Undefined Behavior. Wieso?
    }
    

    In meinem C Buch steht dies ohne weitere Erklaerungen. Ich moechte nun aber gerne verstehen warum das so ist. Ich kann auf s2 per Index auf die Elemente zugreifen, allerdings nicht veraendern. Warum?

    Ich habe bereits im Internet gesucht und dabei keine zufriedenstellene Antwort gefunden (vielleicht habe ich mit mit falschen Begriffen gesucht).



  • s2 ist nur ein Zeiger, in diesem Fall zeigt der auf ein konstantes String-Literal.

    Der Unterschied zwischen s1 und s2 ist Folgender:

    char s1[] = "Hello";
    

    erzeugt ein Array von ausreichend vielen Zeichen auf dem Stack, dass "Hello" dort hinein passt (also 6 Byte: 5 Zeichen plus Sentinel) und kopiert "Hello" dort hinein. Danach kannst du mit diesem Speicher machen, wozu du lustig bist.

    Dagegen erzeugt

    char *s1 = "Hello";
    

    lediglich einen Zeiger auf dem Stack und lässt diesen auf ein String-Literal irgendwo im Speicher zeigen. Wenn man so will, gehört dieses String-Literal dir nicht, und du darfst nicht darin herumschreiben.

    Daher ist diese Weise, char* zu benutzen, auch äußerst unschön; jedes mal, wenn jemand einen char* auf ein String-Literal zeigen lässt, tötet Algorithmos (Gott der Programmierung) ein niedliches Kätzchen auf unnötig grausame Weise. Besser:

    char const *s1 = "Hello";
    

    Das hat die gleiche Funktionalität, und man kommt gar nicht erst in Versuchung, Konstanten ändern zu wollen.



  • Achso. Und wenn ich den Code

    int main()
    {
    	char s1[] = "Hello";
    	char *s2 = s1;
    
    	printf("%c\n",s1[0]); // Ok
    	printf("%c\n",s2[0]); // Ok
    
    	s1[0] = 'T'; // Ok
    	s2[0] = 'T'; // Ok
    }
    

    habe, dann habe ich zwar auch einen Zeiger aber dieses Mal auf ein Array, das sozusagen mir gehoert?



  • Genau.



  • Alles klar. Danke fuer die Hilfe.



  • Das Problem ist ja gelöst, daher mal kurz offtopic.

    seldon schrieb:

    tötet Algorithmos (Gott der Programmierung) ein niedliches Kätzchen auf unnötig grausame Weise.

    Das lese ich jetzt zum zweiten Mal von dir, wie kommst du darauf 😃 ?

    Algorithmos hat noch nicht einmal einen Stupidedia-Artikel, magst du nicht mal einen schreiben?



  • Hmmh schrieb:

    Das Problem ist ja gelöst, daher mal kurz offtopic.

    seldon schrieb:

    tötet Algorithmos (Gott der Programmierung) ein niedliches Kätzchen auf unnötig grausame Weise.

    Das lese ich jetzt zum zweiten Mal von dir, wie kommst du darauf 😃 ?

    Nur eine Auslegung des undefinierten Verhaltens.
    Die Standardauslegung sind Nasaldämonen http://catb.org/jargon/html/N/nasal-demons.html
    Das ist aber eine Glaubensfrage, was nun wirklich passiert. Möglicherweise hat seldon recht.



  • volkard schrieb:

    Nur eine Auslegung des undefinierten Verhaltens.

    Wie langweilig 😞

    Ich hatte eigentlich schon fast gehofft, "Algorithmos" wäre ein einigermaßen fester Begriff in der "eingeweihten Szene" 🤡 .

    Aber auf jeden Fall Danke.



  • Hmmh schrieb:

    Ich hatte eigentlich schon fast gehofft, "Algorithmos" wäre ein einigermaßen fester Begriff in der "eingeweihten Szene" 🤡 .

    Die Glaubensfestigkeit und der Gemeinschaftssinn sind in Religionen oft viel besser, wenn sie noch klein sind.
    Ich bin zum Beispiel einer Religion beigetreten mangels eines Autoradios. Ich bekam ein Autoradio für Umme. Und der Geber hat mir abverlangt, daß ich es niemals verkaufen werde, sondern nur weiter verschenke. Anderenfalls wären die Götter der Elektronik mir fürderhin unhold. Ich werde es nicht verkaufen. Ich werde sogar (unter gleichen Bedingungen), wenn sich Gelegenheit bietet, Autoradios weitergeben, bis ich mindestens zwei weitergegeben habe (inzwischen kann ich mir es leisten; es ist ein umgekehrter Generationenvertrag). Damit wächst die Religion sogar exponentiell, wenn viele so lieb sind wie ich. Mal schauen.
    Wir sind erst am Anfang. Aber in 500 Jahren wird man lachen, wenn der Autoverkäufer damit wirbt, daß in seinem automatischen Nahbodenfluggerät ein Radio schon drin ist. Welcher Unfug, wenn der Käufer schon in der vierten Generation Autoradioist ist.



  • Hmmh schrieb:

    seldon schrieb:

    tötet Algorithmos (Gott der Programmierung) ein niedliches Kätzchen auf unnötig grausame Weise.

    Das lese ich jetzt zum zweiten Mal von dir, wie kommst du darauf 😃 ?

    Das dachte ich mir auch als ich es las.

    Ansonsten scheinen heute alle Drogen genommen zu haben. Muß wohl am Freitagabend liegen.
    Angefangen von "Unschöner Umgangston" (anscheinend gelöscht) über "Wie kann ich eine .exe Datei in Maschinensprache betrachten ?" bis hier.

    Trotzdem ein schünes Wochenende und einen erträglichen Kater euch allen.



  • volkard schrieb:

    Damit wächst die Religion sogar exponentiell, wenn viele so lieb sind wie ich. Mal schauen.

    Ich hege die Befürchtung, die Basis dieser Exponentialfunktion könnte kleiner als eins sein. Du musst ein bisschen mystischen Zauber aufbauen, um die Leute zu ködern; denk dir ein paar Prophezeiungen aus. Nichts zu konkretes, man muss es ja nachher noch so auslegen können, als wäre es wirklich eingetreten -- so Horoskopzeugs halt.

    Im Übrigen gehören zu einer guten Religion Schismen - man muss die absolute Wahrheit kennen, sich aber nicht darauf einigen können, was sie ist. Ich nehme an, dass mit der Erfindung des Digitalfunks der Grundstein für die Autoradioreformation gelegt ist; jetzt müssen sich aber die Digitanten auch um Protokolle zanken, während die Analogoliken den Dualismus von Amplituden- und Frequenzmodulation mystisch verklären. Mit oder ohne CD-Spieler? Darüber muss man schon einen heiligen Krieg austragen. Die Frage nach Navis und Surround-Sound kann man aber auf zukünftige Propheten abschieben.

    Wenn ein Parkhaus eröffnet wird, in dem nur Autos mit Analogradio erlaubt sind, dann hast du es geschafft. (Dass der analoge Rundfunk in absehbarer Zeit abgeschaltet werden soll, wird einen devoten Gläubigen nicht beeindrucken.)



  • EOP schrieb:

    Angefangen von "Unschöner Umgangston" (anscheinend gelöscht)

    http://www.c-plusplus.net/forum/295950



  • Ich frage mich, weshalb mir gcc mit Wall das problemlos kompiliert!

    #include <stdio.h>
    
    int main()
    {
        char *a = "Hallo";
        printf("%c\n", a[1]);
    
        return 0;
    }
    


  • Auf den String elementweise zugreifen ist erlaubt. Nur das veraendern ist undefiniert.

    Dabei tritt kein Fehler zur Compile-Zeit auf aber bei der Laufzeit.



  • Danke, das endet bei mir tatsächlich mit einem Speicherzugriffsfehler!
    Aber soweit ich weiss, ist das bei Funktionsparametern wo ein Array übergeben wird und beim Argument so getan wird, es sei ein Zeiger, kein Problem! Deswegen war ich verwirrt.

    Liebe Grüße
    Steffo



  • Ja, bei der Uebergabe an eine Funktion, die den String veraendert, muss man davon ausgehen, dass der Client der Funktion einen Pointer auf ein char Array und nicht auf eine String Konstante uebergibt.
    Sonst crasht das Programm.



  • C ist schon eine verdammt gefährliche Sprache, wie ich mal wieder feststellen musste. 😮



  • C ist nur in den Händen eines Idioten gefählich.



  • 314159265358979 schrieb:

    C ist nur in den Händen eines Idioten gefählich.

    Die Aussage von dir ist aber auch idiotisch, also Finger weg von C. 😉



  • 314159265358979 schrieb:

    C ist nur in den Händen eines Idioten gefählich.

    Mir ist vollkommen klar, dass diese Stammtischparole kommen musste, aber sie ist eben nur eine Parole, die Aussage impliziert nämlich, dass derjenige, der die Parole ausspricht, keine Bugs in Programmen einbaut. Da das nun wirklich nicht sein kann, bedeutet das wiederum, dass derjenige selbst ein Idiot ist. 😉


Anmelden zum Antworten