Rückgabewert von sizeof()



  • Hallo Leute,
    mal wieder ein seltsames Problem auf dessen Lösung ich auch nach Stunden ausprobieren von allen möglichen und unmöglichen Sachen nicht komme:

    void test1()
    {
    int *i=(int *)malloc(x*sizeof(int));
    printf("%d - %d - %.2f - %.2f",(int)sizeof(x),(int)sizeof(int),(float)sizeof(x),(float)sizeof(int));
    free(i);
    i=NULL;
    return;
    }
    

    sollte doch eigentlich fehlerfrei funktionieren, oder seh ich da was falsch? Wie auch immer, ich kann kompilieren und ausführen, nur die Ausgabe von printf() erscheint sehr seltsam. Natürlich ersetze ich "x" vorm kompilieren durch eine Zahl, aber ganz egal was ich auch einsetze, ob 1, 2, 20 oder 100, ich krieg - IMMER - folgendes Ausgegeben: "4 - 4 - 4.00 - 4.00"

    Die Funktion test1() selber ist in einer selbstgeschriebenen Header-Datei deklariert und auch definiert, also ich hab die da komplett reingeschrieben, normalerweise stehen ja in den Headers nur die Deklarationen, oder? Kann es evtl. daran liegen? Desweiteren wird die Funktion aus einem Thread heraus gestartet, daran kann es doch aber eigentlich auch nicht liegen...

    Ihr merkt ich bin gerade etwas verzweifelt, aber ich habe gerade absolut keinen Plan, was hier falschlaufen könnte, fällt euch etwas ein? realloc() anstelle von malloc() bringt dasselbe. oder ist das normal, das sizeof() immer 4 zurückliefert? Kann doch aber eigentlich nicht sein, ich verwende sizeof() eigentlich, um mit recv() Daten zu empfangen und krieg seitdem dieses Phänomen auftritt immer nur 4 Bytes gesendet (bzw. deshalb ist es halt aufgefallen).

    Vielen Dank für eure Tipps

    david.



  • 4 ist ganz natürlich auf gängigen 32Bit Systemen.

    Welche Ausgabe würdest du denn erwarten??
    sofern x ein int ist, fragst du doch 4mal nach der Größe von int.

    Erklär mal, was du machen willst.



  • ja, für

    sizeof(int);
    

    is es klar dass da 4 rauskommt aber doch nicht für

    sizeof(i);
    

    wenn ich vorher ein

    int *i=(int *)malloc(20*sizeof(int));
    

    gemacht hab. Da reservier ich doch dann Platz für 20 int-Werte also müsste da doch 80 rauskommen, oder hab ich da was falsch verstanden?



  • achja, was ich ursprünglich machen wollte, war, sagen wir Platz für 30 char-Werte reservieren und dann mit

    bytes=recv(MySock,i,sizeof(i),0);
    

    30 Zeichen vom korrekt geöffneten Socket MySock abholen (ja, es werden auch 30 Zeichen gesendet, daran liegt es also nicht 🙂 )
    Es kommen aber immer nur 4 Zeichen an (i ist natürlich in dem Fall als char deklariert, genauso wie der cast etc. angepasst sind)



  • malloc liefert einen Zeiger auf den Anfang deines reservierten Speicherblocks zurück. Da dein Zeiger auf einen int-Wert verweist (int *i) bekommst du auf sizeof(i) natürlich 4 zurück.



  • ich kann kompilieren

    Sollte mich stark wundern wenn das dein compiler schluckt. Du öffnest nämlich mehr Klammern als du schießt (Klammer vor float ist falsch gedreht).

    int *i=(char *)malloc(x*sizeof(int));

    Wieso casts du void* zu char* und anschließed zu int*?

    sizof gibt nicht dem Wert einer Variablen sonder die Grösse des gebrauchten Speicherplatzes in Bytes. Also

    int x;
    x=rand();
    printf("%d",sizeof(x));
    

    Wird immer 4 printen da int 4 byte gross ist.
    Eine frei stehend Zahl (#define x 1 fällt auch darunter) ist immer int, sofern sie nicht gecasted ist.
    Dies wird 4 printen:

    printf("%d",sizeof(4));
    

    Dies aber 1:

    printf("%d",sizeof((char)4));
    

    Und dies wird 4 printen:

    #define x 1
    printf("%d",sizeof(x));
    


  • Da reservier ich doch dann Platz für 20 int-Werte also müsste da doch 80 rauskommen, oder hab ich da was falsch verstanden?

    Sollte mich wundern denn i ist dann vom Type her ein Pointer und kein Array und somit würde ich sagen sizeof(i) wird dir 4 geben.



  • @drvoodoo: ok, da das ganze programm doch etwas umfangreicher ist, hab ich das wesentliche hier nochmal abgetippt und dabei sind mir wohl ein paar Tippfehler unterlaufen, sorry.
    Also, die Klammer beim float ist natürlich andersrum und der cast soll natürlich einen int * und keinen char * ergeben.
    ansonsten sind deine beispiele natürlich korrekt, aber ich wollte ja auch weder den wert von i noch die größe eines int anzeigen lassen, sondern rausfinden, wieviel platz für meinen Zeiger auf eine int-Variable reserviert ist.

    @swabian
    Heißt dass, das ich mit sizeof() nicht herausbekommen kann, wieviel Platz für i reserviert worden ist?

    Danke schonmal für eure Hilfe
    🙂



  • OK, ihr habt mal wieder recht gehabt 😃

    Ich bin auf das ganze Schlamassel auch nur gekommen, weil ich bisher immer eine feste Anzahl an Zeichen gesendet hab, dementsprechend Arrays benutzen konnte und das Empfangen dann mit sizeof() natürlich funktionierte (weil festes Array halt).
    Jetzt hab ich gestern in einem Schritt mehrere Codeteile umgestellt, und u.a. auch dafür gesorgt, dass ich jetzt eine dynamische Anzahl an Zeichen senden kann, benutze jetzt natürlich Pointer und war der festen Überzeugung das malloc() irgendwas falsch macht 🙂 , naja, jedenfalls lags halt am sizeof auf einen Pointer, dass ich natürlich immer nur 4 Bytes empfangen wollte. Bescheuert sowas :p

    Hab sogar extra nochmal in der Doku wegen sizeof() nachgeschaut, aber das hat mir dann auch nicht auf den richtigen Trichter geholfen...

    Danke an euch alle!


Anmelden zum Antworten