_ultoa_s wie richtig aufrufen?



  • Hallo,

    ich habe hier folgenden Code:

    unsigned long i=2222;
    char buffer[15];
    _ultoa_s(i, buffer, strlen(buffer), 10);
    

    Das Programm lässt sich auch ohne Warnings kompilieren, aber wenn ich es starte, dann sagt Windows dass ein Problem festgestellt wurde (nicht welches) und fragt mich ob ich nen Problembericht senden will 😃

    Offensichtlich rufe ich die Funktion falsch auf, denn wenn ich anstelle von strlen(buffer) "15" hinschreibe für die Anzahl der Elemente die in den Buffer reinpassen, läuft alles ohne Probleme. Aber das ist natürlich Mist, da einen konstanten Wert reinzuschreiben.

    Kann mir jemand sagen, was ich falsch mache?



  • sizeof(buffer)



  • Dein Buffer ist nicht initialisiert also findet strlen keine terminale 0 und schießt über das Ende hinaus.



  • Hallo,

    also sizeof ist doch falsch, oder? Damit kriege ich doch den Wert, den z.B. ein int im Speicher belegt?!

    Mhm, gut, der Buffer ist nicht initialisiert. Aber wenn ich ihn vorher initialisiere, in etwa so: char buffer[15]={0}; dann liefert strlen(buffer) ja 0 zurück, oder?

    Also wenn ich Microsoft richtig verstehe, dann ist doch an dieser Stelle der Funktion die Größe anzugeben, die maximal in den buffer passen kann, oder? Und strlen liefert mir ja nur was zurück, wenn irgendwo in dem Buffer mal irgend was drin steht, was mit \0 abgeschlossen ist?!

    Total verwirrt...



  • sizeof ist hier schon richtig. Du kannst die 15 auch direkt eintragen oder die Templateüberladung nutzen.

    unsigned long i=2222;
    char buffer[15];
    _ultoa_s(i, buffer, 15, 10);	
    // oder
    _ultoa_s<15>(i, buffer, 10);
    


  • Auf diese scheiss Funktion solltest du verzichten! benutzt stringstreams dafuer, siehe FAQ



  • Warum ist sizeof hier richtig? Damit kriege ich doch höchstens die Zahl, zurück die ein char im Speicher belegt?!

    Ist es möglicherweise von MS direkt so vorgesehen, dass man die Größe des Buffers "hard reincoded"?

    Danke.



  • Gast34838 schrieb:

    Warum ist sizeof hier richtig? Damit kriege ich doch höchstens die Zahl, zurück die ein char im Speicher belegt?!

    Nein, Du bekommst die Größe, die ein char[15] im Speicher belegt, weil buffer kein char sondern ein Array von chars ist.



  • Vielen Dank für die Hilfe! Hab das eben nochmal mit sizeof durchexerziert und es geht tatsächlich!! Echt verrückt, ich wusste tatsächlich nicht dass man mit sizeof die Größe eines Arrays in Byte kriegt. Damit kann ich ja theoretisch zur Laufzeit von jedem Array die Anzahl der möglichen Elemente kriegen, indem ich in etwa so etwas wie das schreibe:

    int elemente_anzahl = 0; 
    int array[100] = {0};
    elemente_anzahl = (sizeof(array))/(sizeof(int));
    

    Stimmt ihr mir zu?



  • Das stimmt, allerdings musst du aufpassen, wenn du Arrays an Funktionen übergibst, da dann die Grösse als Information verloren geht. Auch wenn du mit Zeigern arbeitest, kann es sehr schnell heikel werden.

    Generell empfehle ich dir jedoch, Arraydimensionen in separablen Variablen zu speichern, das ist auch langfristig sicherer - oder du steigst bei komplexeren Problemen direkt auf Typen wie std::vector um.


Anmelden zum Antworten