malloc und sizeof



  • Hallo Kollegen,
    habe ne Verständnisfrage zum Thema malloc und der Größenangabe wieviel Speicher allokiert werden soll.

    Ich habe eine Methode die mir als Rückgabewert die Anzahl der gelesenen Bytes zurückgibt und zusätzlich den gelesenen Text in eine char variable schreibt.

    Also so etwas

    int byte = 0;
    char text[5000];
    
    byte = getdata(text);
    

    Nun möchte ich aus dem String text alle gelesenen Zeichen herauschneiden, und diesen Speicher dafür dynamisch allokieren.

    So?

    char* pointer;
    pointer = malloc(byte);
    memcpy (pointer ,buffer,byte); 
    free pointer;
    

    oder so?

    char* pointer;
    pointer = (char *)malloc(sizeof(char)*byte);
    memcpy (pointer ,buffer,sizeof(char)*byte); 
    free pointer;
    

    Welche Lösung ist richtig?
    Ich denke die 2, aber warum?

    Kann mir vllt. jemand mal erklären wann ich mit sizeof arbeiten muss, und wann eine einfache Byteangabe ausreicht?

    Würdet mir sehr helfen 🙂 Danke



  • Eigentlich genügen da zwei Infos:

    1. malloc erwartet eine Byteangabe
    2. sizeof(char) ist garantiert 1

    Also ist Variante 2 natürlich korrekt, aber Variante 1 auch und ist IMHO vorzuziehen. sizeof brauchst Du natürlich sobald Du z.B. eine Struktur oder ein int(short,float,...)-Array anlegst, um aus Anzahl und Typ die Größe in Bytes zu ermitteln 😉



  • LordJaxom schrieb:

    Eigentlich genügen da zwei Infos:

    1. malloc erwartet eine Byteangabe
    2. sizeof(char) ist garantiert 1

    Also ist Variante 2 natürlich korrekt, aber Variante 1 auch und ist IMHO vorzuziehen. sizeof brauchst Du natürlich sobald Du z.B. eine Struktur oder ein int(short,float,...)-Array anlegst, um aus Anzahl und Typ die Größe in Bytes zu ermitteln 😉

    Hallo LordJaxom,
    vielen Dank für die schnelle Antwort....

    Noch ne kleine Nachfrage:
    Ich benötige sizeofchar beim malloc also nur wenn der benötitge Platz für das Speichern des Wertes größer als 1 Byte ist?

    D.h. ein char Zeichen entspricht genau 1 Byte im Memory? Ist dies genauso mit int Werten?

    Denn ich dachte wenn ich eine int variable statisch deklariere wird automatisch 4 Byte für die Variable allokiert? D.h. wenn ich weiss das ich nur eine Zahl (von 0-9) benötigt wird, dann würde es auch reichen wenn ich einen Zeiger vom Typ int auf einen 1 Byte Block machen?

    Aber wieso passen dann beim statischen int wert 10 Stellen (–2147483648 +2147483647 ) in einen integer wert, wenn nur 4 Byte allokiert werden?

    Danke 🙂



  • Nein, bei ints wuerdest Du natuerlich Variante 2 nehmen. (mit int statt char)



  • SG1 schrieb:

    Nein, bei ints wuerdest Du natuerlich Variante 2 nehmen. (mit int statt char)

    Alles klar 🙂
    Habe jetzt ne Tabelle gefunden in der beschrieben ist, wieviel Speicher welcher Variablentyp benötigt...

    Damit is klar wann man sizeof nimmt 😉

    Wie verhält sich das Ganze eigentlich mit Unicode? Da kann ja ein Byte bis zu 4 Byte werden, richtig? D.h. ein Char-Zeichen kann bis zu 4 Byte groß werden..

    Wenn ich jetzt ohne sizeof angabe beim malloc arbeiten würde (auch bei char), und ich stelle später auf unicode dann müßte ich das programm komplett überarbeiten, da die char zeichen ja mehr speicher benötigen könnten?

    ... oder wie verhält sich das ganze im Unicode?

    Danke 🙂

    Ich sehe schon, hier sind die Kompetenten Jungs am Werk 🙂



  • wenn du mit unicode anfaengst, klaeren sich solche fragen von alleine. das sei gesagt: du wirst sizeof brauchen und unicode chars sind konstant gross. UTF-8 willst du nicht im speicher manipulieren, sondern nur speichern.



  • codefrag schrieb:

    SG1 schrieb:

    Nein, bei ints wuerdest Du natuerlich Variante 2 nehmen. (mit int statt char)

    Alles klar 🙂
    Habe jetzt ne Tabelle gefunden in der beschrieben ist, wieviel Speicher welcher Variablentyp benötigt...

    Verlass Dich nicht allzusehr auf solche Tabellen. Der Standard gibt in den meisten Faellen nur Mindestgroessen vor, die konkreten Werte koennen sich von Architektur zu Architektur aendern.

    Sprich: Niemals die Werte fest kodieren, sondern immer sizeof verwenden (ausser bei char, da ists wie gesagt egal)

    Damit is klar wann man sizeof nimmt 😉

    Immer, wenn man nicht mit char arbeitet 😉

    Wie verhält sich das Ganze eigentlich mit Unicode? Da kann ja ein Byte bis zu 4 Byte werden, richtig? D.h. ein Char-Zeichen kann bis zu 4 Byte groß werden..

    Nein, ein char ist immer 1 Byte gross. Fuer Unicode-Zeichen brauchts dann halt 'nen anderen Datentyp.


Anmelden zum Antworten