Eine Frage zur Nullterminierung



  • Hallo zusammen,

    betrachten wir den folgenden Codeschnipsel:

    #include <stdio.h>
    #include <stdlib.h>
    
    int split_key_value(char* str, ssize_t len, char** prefix, char** suffix) {
    	int split_pos = 5;
    
    	*prefix=malloc(sizeof(char)*(split_pos+1));
    	memcpy(*prefix, str, sizeof(char)*split_pos);
    //	(*prefix)[split_pos] = '\0';
    
    	return 0;
    }
    
    int getSize (char * s) {
        char * t; 
        int size = 0;
    
        for (t = s; *t != '\0'; t++) {
            size++;
        }
    
        return size;
    }
    
    int main() {
    
    	const char* str = "CA_ID=5";
    	ssize_t len = 8;
    
    	char* prefix, *suffix;
    	prefix = suffix = NULL;
    
    	printf("%s\n", str);
    
    	if(split_key_value(str, len, &prefix, &suffix) == -1){
    		printf("Error\n");
    		return 0;
    	}
    
    	printf("prefix: %s\n", prefix);
    	printf("prefix size:%d\n", getSize(prefix));
    
    	free(prefix);
    	free(suffix);
    }
    

    Warum bekomme ich mit getSize das richtige Ergebnis von 5 (die Länge von CA_ID ist 5), obwohl ich den String nicht mit '\0’ terminiert habe?

    Vielen Dank



  • Warum nicht? Es ist malloc nicht verboten mit 0 initialisierten Speicher auszulieferm. Es ist nur nicht garantiert => es ist falsch



  • Also liegt es daran, dass bei mir malloc den Rest des Speichers mit 0 initialisiert?


  • Mod

    Ach, jetzt wollte ich gerade deine zweite Frage beantworten, aber du hast es offensichtlich selbst entdeckt und sowohl den Fehler als auch die Frage wegeditiert 😞

    Allgemein solltest du Compilerwarnungen aktivieren und ernst nehmen. Du hast const-Verletzungen, hast malloc nicht importiert, und mehr. Dein Problem 2 hätte ein Compiler wahrscheinlich nicht entdeckt, aber viele Fehler ähnlicher Art würde ein Compiler auch finden können.


  • Mod

    @freakC sagte in Eine Frage zur Nullterminierung:

    Also liegt es daran, dass bei mir malloc den Rest des Speichers mit 0 initialisiert?

    Unwahrscheinlich. Malloc selber wird nichts machen (außer vielleicht im Debugmodus). Aber ein Programm bekommt von typischen Betriebssystemen Speicher zugewiesen, der anfänglich genullt ist, aus Sicherheitsgründen. Und da dies dein erstes und einziges malloc im Programm ist, ist der an dieser Stelle noch in diesem Ursprungszustand. Nach ein paar Runden malloc, Schreiben, und free wird sich das aber ändern.



  • @SeppJ sagte in Eine Frage zur Nullterminierung:

    Ach, jetzt wollte ich gerade deine zweite Frage beantworten, aber du hast es offensichtlich selbst entdeckt und sowohl den Fehler als auch die Frage wegeditiert 😞

    Ja, ich habe in der Tat schnell den Fehler gefunden. Hatte die Klammerung falsch .... Danke trotzdem 😉



  • @SeppJ sagte in Eine Frage zur Nullterminierung:

    @freakC sagte in Eine Frage zur Nullterminierung:

    Also liegt es daran, dass bei mir malloc den Rest des Speichers mit 0 initialisiert?

    Unwahrscheinlich. Malloc selber wird nichts machen (außer vielleicht im Debugmodus). Aber ein Programm bekommt von typischen Betriebssystemen Speicher zugewiesen, der anfänglich genullt ist, aus Sicherheitsgründen. Und da dies dein erstes und einziges malloc im Programm ist, ist der an dieser Stelle noch in diesem Ursprungszustand. Nach ein paar Runden malloc, Schreiben, und free wird sich das aber ändern.

    Okay, gut zu wissen. Also immer schön händisch Strings terminieren 🙂

    Grüße


  • Mod

    @freakC sagte in Eine Frage zur Nullterminierung:

    Okay, gut zu wissen. Also immer schön händisch Strings terminieren 🙂

    Eigentlich auch nicht wirklich. Ich war davon ausgegangen, dass dein Code hier nur irgendwelche Lernexperimente sind, daher habe ich nichts gesagt. Aber nichts davon würde man jemals auch nur so ähnlich in echtem Code machen. In echtem Code würdest du die ganzen Standardfunktionen zur Stringbearbeitung nutzen, die sich dann in aller Regel sowieso um das korrekte Einhalten des C-Stringkonzepts kümmern.



  • @freakC sagte in Eine Frage zur Nullterminierung:

    Malloc selber wird nichts machen (außer vielleicht im Debugmodus).

    Ja, die MSVC Runtime macht das im Debug Mode so, malloc/new gibt da Speicher zurück der mit einem bestimmten Muster gefüllt wurde (0xCD oder sowas). Sehr praktisch um solche und ähnliche Fehler zu finden.



  • Wenn Du mit Null initialisierten Speicher willst dann nimm calloc().



  • Danke für die Infos zur Nullterminierung. Das kommt im nächsten Semester und weiß dann schon, worauf ich zurückgreifen werde! 😉


  • Mod

    @codegod70 sagte in Eine Frage zur Nullterminierung:

    Danke für die Infos zur Nullterminierung. Das kommt im nächsten Semester und weiß dann schon, worauf ich zurückgreifen werde! 😉

    Bitte hör auf, jeden Thread mit einer nichtssagenden Floskel zu versehen!



  • @SeppJ Tut mir leid, wenn ich mich über die einzelnen Beiträge freue. Endlich habe ich was gefunden, dass mir weiter hilft. Aber wenn das nicht erwünscht ist, was soll ich machen? Ich möchte doch nur in einer Community mich zugehörig fühlen. 😥


  • Mod

    @codegod70 sagte in Eine Frage zur Nullterminierung:

    @SeppJ Tut mir leid, wenn ich mich über die einzelnen Beiträge freue. Endlich habe ich was gefunden, dass mir weiter hilft. Aber wenn das nicht erwünscht ist, was soll ich machen? Ich möchte doch nur in einer Community mich zugehörig fühlen. 😥

    Vereinzelt ist das ja nicht verkehrt, aber: Alle diese Threads poppen jetzt für jeden Nutzer in den Feed, dass es Neuigkeiten gibt. Und dann haben sie jetzt 15+ Threads, in denen nur Dinge wie "Danke" oder "Ich auch" stehen. Sind das in der Menge wirklich lesenswerte Kommentare?



  • @SeppJ Wie gesagt, es tut mir leid. Werde mich zurückhalten. 😟



  • @codegod70 Wenn du einzelne Beiträge besonders hilfreich findest, kannst du sie auch einfach up-voten (mit dem kleinen "∧" Button rechten nebem dem "Zitieren" Link). Da freuen sich vermutlich die meisten drüber und du störst keine anderen damit.


Log in to reply