Groesse des allokierten Speichers ermitteln



  • Hallo Leute,

    ich allokieren hiermit speicher:

    long* GetMem(void)
    {
        int Pages=7;
        long *data=calloc(Pages*126,2);
        //jetzt kommt was rein in die Daten
        return data;
    }
    

    Wenn ich nun in einer anderen Funktion das aufrufe, wie finde ich heraus, wie gross der allokierte Speicher ist, da Pages je nachdem variabel ist?

    void foo(void)
    {
    long *content=GetMem();
    //jetzt brauche ich aber fuer ne Schleife die Anzahl der allokierten Words im Speicher
    }
    

    danke, der Guenther



  • Hallo

    entweder übergibst du an foo auch die Anzahl an Elementen, oder du nimmst besser noch gleich ein STL-Container, wie vector<long>

    bis bald
    akari



  • akari schrieb:

    Hallo

    entweder übergibst du an foo auch die Anzahl an Elementen, oder du nimmst besser noch gleich ein STL-Container, wie vector<long>

    Noch was uebergeben? Wie das? Und STL-Container kenne ich noch nicht.

    Aber es gibt keine Moeglichkeit das Nachtraeglich rauszufinden?

    Danke schonmal.

    der Guenther.



  • Hallo

    Wenn du Pages als Übergabeparameter benutzten würdest, hättest du nicht die Probleme.

    long* GetMem(int Pages)
    {
        long *data=calloc(Pages*126,2);
        //jetzt kommt was rein in die Daten
        return data;
    }
    
    long *data = GetMem(7);
    

    STL-Container sind Erweiterungen von C++, einer davon ist vector<>. Das ist ein dynamisches Array, was immer seiner Größe weiß.
    Zu diesem Thema solltest du dir ein Tutorial durchlesen, siehe Menü auf dieser Seite oben rechts.

    bis bald
    akari



  • Aber ich bekomme Pages gar nicht daher. Das ist etwas, was ich aus einem externen Geraet auslese.

    Aber ich habe mal in der MSDN gewuehlt und bin zufaellig auf

    _msize
    

    gestossen.

    long *buffer;
        size_t size;
    
         if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
          exit( 1 );
    
        size = _msize( buffer );
       printf( "Size of block after malloc of 1000 longs: %u\n", size );
    

    das koennte gehen. Ich probier's mal.

    der Guenther



  • gehts nicht auch ganz einfach mit sizeof() 😕 😕 oder hab ich da was falsch verstanden?



  • long *buffer;
    int s = sizeof(buffer);
    

    sizeof liefert da 4 bytes je nachdem welcher compiler / system, egal wie gross der reservierte speicher ist auf das buffer zeigt.
    also soll heisen: sizeof liefert da die grösse des zeigers nicht die grösse des speichers auf das der zeiger zeigt.



  • was wird dann bei
    long buffer[100]; zurückgeliefert??



  • MasterCounter schrieb:

    was wird dann bei
    long buffer[100]; zurückgeliefert??

    Die Grösse des Speichers. Hier ist buffer aber auch kein Zeiger.

    Guenther schrieb:

    Aber ich habe mal in der MSDN gewuehlt und bin zufaellig auf

    _msize
    

    Ist aber kein Standard. Wenn's standardkonform sein soll, dann nimm einen Container, zB std::vector.

    Oder gib ein struct zurück, welches alle benötigten Infos enthält.

    struct MyMem
    {
        size_t size;
        long* data;
    };
    
    MyMem GetMem(void)
    {
        int Pages=7;
        MyMem mem;
        mem.size=Pages*126;
        mem.data=calloc(Pages*126,2);
        //jetzt kommt was rein in die Daten
        return mem;
    }
    

Anmelden zum Antworten