größe von char array mit sizeof ermitteln?



  • hallo,

    ist es möglich über sizeof die größe eines char arrays zuverlässig herauszubekommen?
    bzw. ist das überhaupt "zulässig"?

    zB: wenn ich sowas schreibe:

    #define MAX 255
    
    void func(void)
    {
        char ca_Tmp[MAX]={0};
    
        for(int i=0; i<10;++i)
        {
            _snprintf(ca_Tmp, sizeof(ca_Tmp), "i = %d", i);
            // oder ist das besser "_snprintf(ca_Tmp, MAX, "i = %d", i);"
        }
    return;
    }
    

    kann man das so machen?
    habe manchmal in meinem prog undeffinierte anzeigen,
    aber keine wirkliche idee wo es herkommt...
    kann das am sizeof liegen, dass die länge manchmal nicht richtig "berechnet" werden kann?

    mfg
    Schandi



  • Was ist _snprintf ?

    EDIT: Und wenn dann sizeof(...)-1, da noch Platz für die schließende 0 sein muss. Außer _snprintf berechnet das mit ein.



  • _snprintf is so was wie sprintf - nur, dass noch ne max-länge mit dabei ist (sicherer etc)...
    und nein, das geht nicht... max. mit strlen () - aber da bekommste ne das raus, was du hier willst ^^ Das Thema gab es aber glaube scho 100de Male (mit int, double, char, .... - arrays) 😛
    Und der Nächste wird eh gleich mit 'Warum char[]? Nimm doch Strings - sind ja im C++-Forum' kommen... ^^
    bb

    //edit: Ja, das andere ist besser (hab gerad den Kommentar mal gelesen ^^)... Aber wie scho bemerkt wurde musste wegen 0-Byte am Ende aufpassen - so wäre es besser:

    snprintf (...., MAX-1, ....); varname[MAX-1] = '\0';
    

    Wenn du genau wissen willst, warum guck in der MSDN - wenn die variable länger is, als der buffer, wird die terminierende 0 nämlich nicht mitgeschrieben... ^^ Btw: Aber jz interessiert mich au mal, warum man noch mit char und snprintf arbeitet! 😛 😉



  • Also bei Array's aufm Stack kannst du die Anzahl der Elemente herausbekommen, in dem du die Größe des Arrays durch die Größe eines Elementes dividierst.

    sizeof(Array) / sizeof(Array[0])
    

    ...

    const std::size_t max(6);
    
    void foo()
    {
        char array[max];
    
        for (std::size_t i(0); i < 10; ++i)
            _snprintf(array, sizeof(array) / sizeof(array[0]) - 1, "i = %d", i);
    }
    

    ... aber naja einfach max - 1 zu übergeben wäre einfacher 😉



  • Schandmaul schrieb:

    _snprintf
    

    😮 😞 😡

    unskilled schrieb:

    Und der Nächste wird eh gleich mit 'Warum char[]? Nimm doch Strings - sind ja im C++-Forum' kommen... ^^

    ... und damit sowas von recht haben! 👍 😃

    *scnr*



  • Schandmaul schrieb:

    ist es möglich über sizeof die größe eines char arrays zuverlässig herauszubekommen?

    Wenn Du ein Array auf dem Stack hast, dann kennst Du die Größe bereits, und bei der Übergabe eines Zeigers kann man es nicht bestimmen.



  • ...'Warum char[]? Nimm doch Strings - sind ja im C++-Forum'... ^^

    weil ich mir mal hab sagen lassen, dass _snprintf c++ ist,
    der nächste "level" ist dann "strings" ^^

    hmm, irgenwas versteh ich nich ganz...

    msdn:
    When applied to a statically dimensioned array, 
    sizeof returns the size of the entire array. 
    The sizeof operator cannot return the size of 
    dynamically allocated arrays or external arrays.
    

    also wenn das geht,

    sizeof(array) / sizeof(array[0]) -1

    ok, die -1 könnte wichtig sein, aber
    wieso kann ich nich gleich

    sizeof(array) -1
    

    schreiben?

    wenn ich ein char array hab und sizeof mit die größe in bytes gibt, sollte das ergebnis doch das selbe sein?

    mfg
    Schandi



  • Das tut es in diesem Fall auch, aber weißt du auch warum?



  • MSDN Library schrieb:

    When applied to a statically dimensioned array, sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.

    So wie du es zitiert hast, sagt es nur aus, dass sizeof bei Arrays von Objekten die auf dem Stack liegen die Größe des gesamten Arrays wiedergibt (also Größe eines Elements * Anzahl an Elemente). Bei Arrays die auf dem Heap erzeugt wurden, kann er dir aber nicht die korrekte Größe ausgeben.

    also wenn das geht,

    sizeof(array) / sizeof(array[0]) - 1
    

    ok, die -1 könnte wichtig sein, aber
    wieso kann ich nicht gleich

    sizeof(array) - 1
    

    schreiben?

    In dem Fall kannst du es schon, was aber daran liegt, das dir sizeof(char) sehr wahrscheinlich 1 zurück gibt. Wenn du dir aber das aus der MSDN nochmal durchließt, verstehst du es vllt.

    Teste mal folgendes:

    #include <iostream>
    
    int main()
    {
        std::cout << "unsigned short array[10];" << std::endl;
        unsigned short array[10];
        std::cout << "sizeof(array) = " << sizeof(array) 
                  << "sizeof(array[0]) = " << sizeof(array[0])
                  << "sizeof(unsigned short) = " << sizeof(unsigned short)
                  << "sizeof(array) / sizeof(array[0]) = " << sizeof(array) / sizeof(array[0]) << 
                  << "sizeof(array[0]) * 10 = " << sizeof(array[0]) * 10 << std::endl;
    }
    

    sizeof(array) = Anzahl der Elemente des Array * Größe jedes einzellnen Elementes (sizeof(array[0])).

    Im speziellen Fall von char geht es halt, weil sizeof(char) == 1 und x / 1 = x 😉

    die -1 könnte wichtig sein

    Ja sind sie. Bei C-Strings (char-Arrays) wird das Ende dadurch signalisiert, das das sog. Nullterminierungszeichen '\0' auftritt. Wenn das fehlt und du bsw. std::strlen auf diesen char_Array aufrufst, erhälst du eine Zugriffsverletzung.
    D.h. muss der char-Array so groß sein, dass dein Satz reinpasst und noch Platz für das Nullterminierungszeichen verbleibt. Normal wird _snprintf dieses aber selber setzen und es ist eher falsch hier Platz für das Nullterminierungszeichen zu lassen.



  • (D)Evil schrieb:

    In dem Fall kannst du es schon, was aber daran liegt, das dir sizeof(char) sehr wahrscheinlich 1 zurück gibt.

    sizeof(char) ist eins ist eins ist eins.
    und bleibt es auch für immer.


Anmelden zum Antworten