sprintf - char* danach nicht löschen?



  • Hallo zusammen,

    bei folgendem Code-Ausschnitt wird stellt sich mir eine Frage:

    char* zahl;
    sprintf(zahl, "Zahl: %d", 888);
    

    Muß danach nicht zahl gelöscht werden bzw. der Speicher wieder freigegeben wird?
    Wenn ja, wie?

    delete zahl;
    

    funktioniert ja nicht...

    Kann ich überhaupt mit irgendeiner Funktion die Länge rauskriegen ohne die
    abschließende 0 zu suchen

    Gruß,
    CSpille



  • meines wissens nach muss speicher nur freigegeben werden wenn du welchen allociert hast also mit malloc() oder so.

    gruessle TDO



  • Oops, dicker Fehler du überschreibst grade deinen Speicher.
    Den Buffer den du mit sprintf() beschreibst musst du selbst vorher
    besorgen. Vom Stack oder Heap. Und je nachdem, auch wieder selbst
    freigeben.
    Die benötigte Länge musste du also selbst wissen bzw. gross genug
    abschätzen.



  • char zahl[128] = "";
    sprintf(zahl, "Zahl: %d", 888);
    // Hier muss nix freigegeben werden
    
    char* zahl = (char*)malloc( 128 );
    memset( zahl, 0, 128 );
    sprintf(zahl, "Zahl: %d", 888);
    ...
    // Hier musst du den Speicher wieder freigeben
    free( zahl );
    

    Aber wie Redhead schon sagte, muss der Puffer immer groß genug sein. Ansonsten bekommst du schnell einen BufferOverflow.



  • Das = "" und memset kannst du aber weglassen, es ist vollkommen unnütz.



  • Und wenn man sich Speicher vom Heap holt der unbedingt genullt werden muss (für was auch immer), dann nimmt man eh calloc().



  • Danke schonmal...

    Dann stellt sich mir noch eine weitere Frage:

    sprintf besitzt ja noch eine belibig lange Parameterliste die mit ...
    angegeben ist.

    Wenn ich sowas selbst verwenden will, wie kann ich auf diese Parameter zugreifen?

    Danke,
    CSpille



  • Schau dir mal va_list, va_end und Co. an.



  • das mit der parameterliste geht nicht viel anders:

    sprintf(zahl,"Zahl 1: %d\nZahl 2: %d\nnZahl 3: %d\n",777,888,999);
    

    für jeden parameter ein %d. so einfach is das 😃


Log in to reply