Compilermeldung: Array-Grösse



  • Hab das bei ein paar Compilern heute getestet.
    Ich gehe mal davon aus das die Compiler-Anbieter den Standard besser verstehen als ich 😕

    #include<stdio.h>
    
    int main(void)
    {
    	char a[3] = "test";	// hier Compiler-Meldung -> ist klar
    	printf("Test: %s\n", a);
    
    	return 0;	
    }
    

    da grübele ich:

    #include<stdio.h>
    
    int main(void)
    {
    	char a[4] = "test";	// warum hier keine Compiler-Meldung?
    	printf("Test: %s\n", a);
    
    	return 0;	
    }
    

    so steht es in fast jedem Buch:

    #include<stdio.h>
    
    int main(void)
    {
    	char a[5] = "test";	//  '\0' -> ist klar
    	printf("Test: %s\n", a);
    
    	return 0;	
    }
    

    Compiler-Meldung fällt je nach Compiler bei a[3] = "test" unterschiedlich aus!
    Mal Warnung - mal Fehler
    Ich hab aber nicht alle Compiler-Schalter durchprobiert.
    Aber a[3] verstehe ich. Was ist mit a[4] = "test".

    Bin mir jetzt nicht ganz sicher ob das hier zu den Compilern soll oder bei C?

    MfG f.-th.



  • Ich geh mal davon aus, dass das C ist (@Mod: kann man IMO verschieben)

    char test[4] = "test";
    

    bedeutet:

    char test[4] = {'t', 'e', 's', 't'};
    

    Das Nullzeichen (und nur das) fällt weg, wenn das Array nicht groß genug ist.

    (In C++ wäre das übrigens nicht erlaubt, da müsste man test 5 Elemente groß machen.)

    Edit: Das steht im C99-Standard in 6.7.8p14 und p32 (letzteres ist ein Beispiel), im C++98-Standard in 8.5.2p2.



  • C++ da diskutieren die hier:
    http://stackoverflow.com/questions/988158/take-the-address-of-a-one-past-the-end-array-element-via-subscript-legal-by-the

    Soweit ich das verstanden hab, wenn man mit dem Feldinhalt arbeiten will, muss es im Array sein. Die Adresse danach darf nur zur Zeigerberechnung genutzt werden.

    Danach gesucht hatte ich, weil ich mehrere Mergesort-Quelltexte im Netz gefunden hab, die oft ein Feld über Arraygrenzen gehen. Ist das auch noch C-standard-konform? Oder hatten die einfach nur Glück?

    Hatte auch Sort-Beispiele in C gefunden, die mehrere Felder über die Arraygranzen gingen - da gehe ich, wenn das funktioniert, von Zufall aus.

    Mein Englisch ist für solche Feinheiten nicht gut genug.

    Aber eine kleine Warnung der Compiler fände ich doch nicht schlecht bei meinem a[4] Beispiel.

    MfG f.-th.



  • Soll das jetzt noch was mit deiner Frage von oben zu tun haben, oder ist das eine neue Frage (ist es überhaupt eine)? Ich seh jedenfalls nicht den Zusammenhang.



  • f.-th. schrieb:

    Aber eine kleine Warnung der Compiler fände ich doch nicht schlecht bei meinem a[4] Beispiel.

    jeder normale lässt die 4 einfach weg, dann passt sich die größe auch automatisch an einen neuen string an.



  • Jeder normale verwendet einen "char*" oder besser noch (um nicht gleich wieder in ein anderes Problem zu geraten) "const char*"...



  • nee, das sind die paranoiden :p



  • Hast Du schion mal Folgendes gemacht:

    char* str = "def";
    strcpy(str, "abc");
    

    ?



  • Jochen Kalmbach schrieb:

    Hast Du schion mal Folgendes gemacht:

    char[] str = "def";
    strcpy(str, "abc");
    

    ?

    ich glaub schon, lass mich mal überlegen... es war bei den ISO 2-alpha codes, da läuft meine app in defaultmode "en" und dann wird das mit einem (ich hoffe) vorher geprüften string überschrieben.

    ja, ich geb zu, das war ein blödes beispiel! du hast natürlich recht mit deiner aussage 🙂



  • Nur noch als kleine Anmerkung:
    Ein String mit "char str[]" deklariert kann man beschreiben; einen mit "char* str" dagegeben nicht!


Anmelden zum Antworten