String verwirrung



  • Ein Stringliteral (Text zwischen "") ist (bei einem C-Compiler) immer Nullterminiert.



  • Es gibt auch Strings, wo der String mit
    dem Carridge-Return-Zeichen terminiert wird.
    Meinst du "auch Sprachen"? In C ist immer \0 am Ende.

    Dein Compiler wird anscheinend automatisch das char-Array mit
    Null initialisieren. Verlassen würde ich mich in der Praxis
    aber darauf nicht!
    Wenn der Compiler das nicht tut ist er kaputt.

    K&R, 2nd ed, S.86 §4.9 sagt eindeutig zu Arrays:

    If there a fewer initializers for an array than the number specified, the missing elements will be zero for external, static and automatic variables.



  • besserwisser schrieb:

    Es gibt auch Strings, wo der String mit
    dem Carridge-Return-Zeichen terminiert wird.
    Meinst du "auch Sprachen"? In C ist immer \0 am Ende.

    Dein Compiler wird anscheinend automatisch das char-Array mit
    Null initialisieren. Verlassen würde ich mich in der Praxis
    aber darauf nicht!
    Wenn der Compiler das nicht tut ist er kaputt.

    K&R, 2nd ed, S.86 §4.9 sagt eindeutig zu Arrays:

    If there a fewer initializers for an array than the number specified, the missing elements will be zero for external, static and automatic variables.

    Bringt dir leider nichts, wenn du gar nicht initialisierst...



  • Also ich hab eben mal probeweise folgendes compiliert und "Müll" bekommen:

    int main()
    {
        char array[5];
        int i;
    
        for(i=0;i<5;i++)
        {
            printf("%d ",array[i]);
        }
    
    }
    

    von daher immer schön mittels

    for(i=0;i<5;i++)
    {
    array[i]=0;
    }
    

    initialisieren oder mittels calloc() speicher anfordern. 😉



  • char array[5] = {0}
    geht auch



  • Oder mit memset



  • Da hab ich wohl was falsch verstanden. 😞 doofe Formulierung...



  • roflo schrieb:

    char array[5] = {0}
    geht auch

    char a[5]={ /* hier steht nichts! */ }; scheint schon zu reichen (jedenfalls bei meinem Test, keine Ahnung was der Standard sagt), aber es muss ein {} her.



  • Der Standard sagt dazu: Syntaxfehler.

    Wenn du selber zugibst, keine Ahnung zu haben, halt einfach die Klappe.



  • Wutz schrieb:

    Der Standard sagt dazu: Syntaxfehler.

    Der gcc frisst es.

    Wenn du selber zugibst, keine Ahnung zu haben, halt einfach die Klappe.

    Irren ist menschlich Herr Professor! 👎



  • Du hast keine Ahnung wovon du redest.
    Also trolle dich dahin woher du kamst und verschone die Welt mit deinen dümmlich-naiven Weisheiten.


  • Mod

    besserwisser schrieb:

    Wutz schrieb:

    Der Standard sagt dazu: Syntaxfehler.

    Der gcc frisst es.

    Das ist nicht das Kriterium für (oder auch gegen) die Korrektheit eines Sprachkonstrukts. Das was du beschreibst ist ein Feature des GCC. Wenn du mit der pedantic-Einstellung compilierst, wird dir der GCC bei den leeren Klammern einen Fehler schmeißen.

    Wer Wutz nicht glaubt (egal wie unhöflich er ist, er weiß wovon er redet), der möge den Standard zu den Themen Initialization (6.7.8 in C99) und Assignment Operators (6.5.16 in C99) lesen.

    PS: Ich sollte noch erwähnen, dass die leeren Klammern in C++ erlaubt sind. Das ist vermutlich auch der Grund, wieso der GCC diese versteht.



  • Ich würde niemals die Kompetenz von Wutz (oder auch SeppJ oder einer der anderen Profis hier) anzweifeln, ledig der Umgangston ist etwas... Aber lassen wir das, ich bin ruhig.


Anmelden zum Antworten