Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 18

Thema: Zum 40.x malloc() und konsorten.

  1. #1
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201

    Zum 40.x malloc() und konsorten.

    Hallo,
    gabs bestimmt schon mindestens 40. mal, ich hab aber über die suche nichts passendes gefunden.

    ich hab mich schon immer gefragt, wie man den Speicher richtig reserviert (allozieren? allokieren? Was auch immer)

    Ich habe zum Beispiel das hier (Natürlich NICHT zur Nachahmung bestimmt):
    Code:
        char* site = getSite(user, pass);
        char* G=malloc(1024);
        char* Y=malloc(1024);
        sprintf(G, "%d", getGreen(site));
        sprintf(Y, "%d", getYellow(site));
        gtk_label_set_label(GTK_LABEL(Green), G);
        gtk_label_set_label(GTK_LABEL(Yellow), Y);
        free(site);
        free(Y);
        free(G);
    Was natürlich alles falsch ist, ausser site, das wurde von curl vernümftig allokiert.
    Die 1024 sind völlig überdimensioniert, für einen Integer, der wenns hochkommt maximal 200 ist. Mit Valgrind kann man garnicht mehr debuggen, weil es schon soviele Reservierungsfehler gibt. Die will ich jetzt lösen, und zwar mit eurer hilfe.
    Also: Wie allokiere ich den Speicher, dass er bei "7\0" auch nur sizeof(char)*2 groß ist?

    MfG Giuly
    Geändert von Giuly (08-11-2005 um 23:14 Uhr)

  2. #2
    Registrierter Benutzer Avatar von Detrius
    Registriert seit
    09.03.2004
    Ort
    Altena
    Beiträge
    64
    Indem Du sizeof benutzt.

  3. #3
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Zitat Zitat von Detrius
    Indem Du sizeof benutzt.
    Worauf denn? sizeof(getGreen(site)) Gibt wohl die Größe des Ints aus.

  4. #4
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    malloc liefert außerdem void* zurück, das musst Du noch casten bevor Du es verwendest.
    Und für die Anzahl wie gesagt sizeof als Parameter in malloc benutzen.
    I haven't lost my mind - It's somewhere on a backup-disc

  5. #5
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Zitat Zitat von SeeksTheMoon
    malloc liefert außerdem void* zurück, das musst Du noch casten bevor Du es verwendest.
    Und für die Anzahl wie gesagt sizeof als Parameter in malloc benutzen.
    Code:
    char* Y=(char*)malloc(sizeof(getYellow(site)));
    So oder was?

    ICh sollte vielleicht sagen, dass getYellow() vom Typ Integer ist.
    Wenns ein char* wäre, wär das ja alles kein Problem. (
    Code:
    char* Y=(char*)malloc(sizeof(char)*(strlen(getYellow(site))+1));
    )
    Geändert von Giuly (09-11-2005 um 01:14 Uhr)

  6. #6
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    Zitat Zitat von Giuly
    Code:
    char* Y=(char*)malloc(sizeof(getYellow(site)));
    So oder was?
    Nein, Du hast ein char-Array also musst Du nach char und nicht char* casten. getYellow kannst Du Dir hier sparen, sizeof(int) macht das gleiche ohne die Funktion durchzurackern. (Schließlich wird dort nachher eine Zahl stehen)
    ICh sollte vielleicht sagen, dass getYellow() vom Typ Integer ist. Wenns ein char* wäre, wär das ja alles kein Problem. (
    Code:
    char* Y=(char*)malloc(sizeof(char)*(strlen(getYellow(site))+1));
    )
    Was hast Du jetzt vor? Sollen so viele char-Elemente angelegt werden wie getYellow Elemente hat? Was macht strlen(getYellow(site))? Wenn getYellow einen Integer liefert, z.B. 5 dann hast Du da strlen(5) stehen. Nicht sinnvoll, oder? Schließlich liefert strlen die Länge eines char* Arrays und bekommt hier aber eine Zahl anstatt des Arrays. casten s.o. Ansonsten wäre das richtig:
    Code:
     var = (datentyp) malloc(sizeof(datentyp)*anzahl);
    if(!var)
         printf("malloc Fehler");
    I haven't lost my mind - It's somewhere on a backup-disc

  7. #7
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Zitat Zitat von SeeksTheMoon
    Was hast Du jetzt vor?
    Wenns ein char* wäre, wär das ja alles kein Problem. (...)
    Und das (...) wäre malloc(sizeof(datentyp)*anzahl);.

    Aber ich versteh nicht, wieso sizeof(int). das sollte doch eigentlich immer 32Bit zurückgeben. und wenn die zahl "7" ist, sollte ja eigentlicht sizeof(char)*(1+1) reserviert werden.

    Und nach char* zu casten sollte eigentlich auch richtig sein. ich will ja kein Char-Array, sondern den Pointer zum ersten Element.

    MfG

  8. #8
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    naja mit 32 bit ist der wertebereich 0-4294967295 (= 2^32), also maximal 10 stellen.
    ein buffer mit 10*sizeof(char) +1 sollte eigentlich immer reichen

  9. #9
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Zitat Zitat von ninguno
    naja mit 32 bit ist der wertebereich 0-4294967295 (= 2^32), also maximal 10 stellen.
    ein buffer mit 10*sizeof(char) +1 sollte eigentlich immer reichen
    Hi,
    Es geht nicht um reichen, sondern um passen. ICh will ja grade Meldungen wie "1024 reserved but 2 used" vermeiden.

    MfG

  10. #10
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    was heisst passen? wenn du einen 11 byte grossen buffer reservierst, dann passt jede 32 bit integer rein. du willst mir nicht erzählen dass du dir sorgen machst damit manchmal 2,3 oder - gott bewahre - 10 byte zu "verschwenden"?

  11. #11
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Du willst die Zahl die getGreen zurück liefert, als String in das char-Array G schreiben, sehe ich an sprintf. Du weißt aber vor vor dem sprintf nicht, wieviele Stellen die Zahl hat. Wie willst du also vorher schon den Speicher für die Darstellung der Zahl reservieren?

    Das ginge höchstens, indem du vorher ermittelst, wieviel Stellen die Zahl hat. Und das geht nicht mit sizeof(int), weil das natürlich immer (architekturabhängig) 32Bit zurück liefert. Klar.

    Aus diesem Grund ist es gang und gäbe, feste Character Arrays zu nutzen. Du musst dafür auch nicht 1024 Chars reservieren, weil ein Integer ausgeschrieben maximal 10 Stellen lang werden kann. Also ein char G[10]; reicht aus. Der dafür reservierte Speicher ist auch nur in der Funktion gültig, wird nach deren Ende wieder freigegeben.

    Dein Programm müsste dann so ausschauen:

    Code:
        char* site = getSite(user, pass);
        char G[10];
        char Y[10];
        sprintf(G, "%d", getGreen(site));
        sprintf(Y, "%d", getYellow(site));
        gtk_label_set_label(GTK_LABEL(Green), G);
        gtk_label_set_label(GTK_LABEL(Yellow), Y);
        free(site);

  12. #12
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Zitat Zitat von ninguno
    was heisst passen? wenn du einen 11 byte grossen buffer reservierst, dann passt jede 32 bit integer rein. du willst mir nicht erzählen dass du dir sorgen machst damit manchmal 2,3 oder - gott bewahre - 10 byte zu "verschwenden"?
    Kommt drauf an, wofür er programmiert. Bei Microcontrollern kann das schon von Belang sein...

  13. #13
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Danke
    Was ist eigentlich der Unterscheid zwischen char[10] und (char*)malloc(10);? Das letztere liefert einen Pointer zu 10 Byte allokiertem Speicher, das ist schon klar. Das andere ist ein Array mit 10 Einträge, auch klar. Aber was ist der Unterschied?

  14. #14
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Aber was ist der Unterschied?
    Ich gehe mal davon aus, dass du nicht wissen willst, das man den Speicher von malloc mit free wieder freigeben kann, und dass char[10] kein Funktionsaufruf sein kann usw...

    Dann bleiben noch eher subtile, aber dennoch gelegentlich wichtige, Sachen übrig. Z.b. ist garantiert, dass du in den von malloc angeforderten Speicher jedes Objekt welches 10 Byte groß ist speichern kannst. In das char-Array aber nicht unbedingt, weil es unter Umständen nicht das richtige "Alignment" besitzt.

  15. #15
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123
    tja und dann dürfte es dir evtl schwer fallen das char-array dynamisch zu allokieren ... und auch wieder frei zu geben ....

    gruesse

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •