Aufgabe - Problem mit *p = malloc()



  • Hallo alles zusammen,

    ich komme leider nicht weiter, würde mich sehr über Hilfe freuen 🙂

    Die Aufgabe (stark zusammengefasst): Implementierung einer eigenen Speicherverwaltung mithilfe des Buddy-Algorithmus. Via malloc() soll ein Speicherbereich beansprucht werden in dem dann später der Speicher selbst verwaltet wird. Nun wollte ich den pointer welche durch malloc() zustande kam einfach weiterverwenden, jedoch kann ich diesen nicht kopieren um später damit zu arbeiten.

    Beispiel:

    #include <stdio.h>      
    #include <stdlib.h>     
    #include <cstdlib>
    #include <memory.h>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <stdio.h>
    
    using namespace std;
    
    unsigned int * mem_start;
    
    bool mem_init(unsigned int mem_size) {
        mem_start = (unsigned int *) malloc(mem_size);
        if (mem_start != NULL) {
            //*mem_init_start = 99;
            cout << "mem_init()    - Allokation erfolgreich." << endl;
            cout << "              - Von " << &mem_start << " bis " << &mem_start + mem_size << endl;
        } else {
            cout << "mem_init()    - Kein virtueller RAM mehr verfügbar." << endl;
            return EXIT_FAILURE;
        }
        return EXIT_SUCCESS;
    }
    
    int main() {
    
        unsigned int mem_size = 2048;
        mem_init(mem_size);
    
        unsigned int * mem_start_copy;
        mem_start_copy = mem_start;
    
        cout << "mem_start:      " << &mem_start << endl;
        cout << "mem_start_copy: " << &mem_start_copy << endl;
        return 0;
    }
    

    Ausgabe:

    mem_init()    - Allokation erfolgreich.
                  - Von 0x6013d8 bis 0x6053d8
    mem_start:      0x6013d8
    mem_start_copy: 0x7fff3bcda120
    

    Wieso geht das schief ?

    Die Idee war mithilfe des "mem_start" später den Speicherbereich meiner Listen-Nodes zu definieren. Also z.B. wenn aus dem vollen Bereich (2048 Bytes) zwei neue entstehen,
    den ersten auf "Beginn = &mem_start" und "Size = mem_size / 2"
    den zweiten auf "Beginn = &mem_start + mem_size / 2" und "Size = mem_size / 2". Hoffe es ist nachvollziehbar 🙂

    Bin über jede Hilfe dankbar !!



  • Was geht schief? Ich kann kein Problem erkennen. Ausser dem unnötigen Cast in Zeile 15.



  • Du gibst die Adressen der Zeiger aus, nicht die Adressen des allokierten Speichers.



  • Der versuch war später über folgenden Node und dem Buddy-Algorithmus das System zu organisieren...

    struct buddy_block {
        unsigned int size; // größe
        unsigned int *start; // startadresse
        bool alloc; // status ob belegt oder frei
    
        buddy_block *right; // nächster buddy
        buddy_block *left; // vorheriger buddy
    
    };
    

    Wird also zum Beispiel der erste Node erzeugt ist dieser genau so groß wie der zuvor via malloc() geforderte speicher. Dem Node wollte ich dann direkt die Adresse "mem_start" zuweisen, z.B. "node.start = &mem_start".

    Wie kann ich denn direkt auf die Speicheradresse zugreifen ? Geht dies nicht über "var = &mem_start" ?



  • Du gibst die Adressen der Zeiger aus, nicht die Adressen des allokierten Speichers.



  • Du musst systematischer an Sache herangehen.
    - du benötigst ein entsprechen Objekt (Instanz eines Typs, das alle Verwaltungsinfos enthält, werfe die oberhässliche verk, Liste raus und nimm was Vernünftiges)
    - das Objekt legst du in main an
    - dann definierst du deine gewünschten Funktionalitäten, wobei du dort dann jedesmal einen Zeiger auf das Objekt übergibst, also z.B.

    void *myalloc(struct policy*,size_t new);
    void *myfreeall(struct policy*);
    void *myfreelastalloc(struct policy*);
    usw.
    

    Davon kannst du dann natürlich auch mehrere Objekte anlegen, du hast das quasi mehrere unabhängige Mini-Memorymanager.
    Aufwändiger wird es dann, wenn du realloc nachbauen willst.



  • Soo habe nun auch einen Account. (newbie_0x815)

    Okay, danke erstmal für alle Beiträge. So wie es scheint habe ich noch ein paar Verständnissprobleme die nicht all zu schnell aus der Welt zu schaffen sind. Werde mich weiter einlesen und dann Rückmeldung geben.

    Danke an alle ! 🙂



  • Sooo jetzt habe ich es verstanden !!!

    Der Code-Teil wie ich ihn brauche um meine Buddys zu realisieren mit einer Byteweisen Adressierung...

    #include <cstdlib>
    #include <memory.h>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <stdio.h>
    
    #define TRUE 1
    #define FALSE 0
    
    using namespace std;
    
    unsigned char * total_mem_start;
    unsigned int total_mem_size;
    
    bool mem_init(unsigned int mem_size) {
        total_mem_start = (unsigned char *) malloc(mem_size); // Gibt zeiger auf mem_size Bytes vom Heap zurück
        total_mem_size = mem_size;
        total_mem_start[0] = 'a';
    
        if (total_mem_start != NULL) {
            cout << "mem_init()    - Allokation erfolgreich." << endl;
            cout << "              - Startadresse                " << &total_mem_start << endl;
            cout << "              - Endadresse                  " << &total_mem_start + total_mem_size << endl;
            cout << "              - Anzahl an Bytes             " << total_mem_size << endl;
            cout << "              - Startadresse + 1            " << &total_mem_start + 1 << endl;
            cout << "              - Inhalt total_mem_start[0]   " << &total_mem_start[0] << endl;
    
        } else {
            cout << "mem_init()    - Kein virtueller RAM mehr verfügbar." << endl;
            return EXIT_FAILURE;
        }
        return EXIT_SUCCESS;
    }
    
    int main(int argc, char** argv) {
    
        mem_init(1024);
    
        return 0;
    }
    

    Der Output....

    mem_init()    - Allokation erfolgreich.
                  - Startadresse                0x6013d8
                  - Endadresse                  0x6033d8
                  - Anzahl an Bytes             1024
                  - Startadresse + 1            0x6013e0
                  - Inhalt total_mem_start[0]   a
    

    Nochmal Danke an alle !!!



  • 0x815 schrieb:

    Sooo jetzt habe ich es verstanden !!!

    Nein, hast du nicht.

    Du weißt (durch die Textausgabe) jetzt, wo dein Pointer total_mem_startliegt, aber nicht wo der Speicher liegt, den du angefordert hast.

    - Startadresse                0x6013d8
                  - Startadresse + 1            0x6013e0
                                                --------
                  Differenz                            8
    

    Bei unsigned char sollte da 1 stehen.
    Aus der 8 schließe ich, dass du dein Programm als 64-Bit Target compilierst.


Anmelden zum Antworten