Vollständige Version anzeigen : C Heap mit Char simulieren


Spo0n22
04.11.2014, 18:17

Hey Leute,

bin totaler Neuling in C. Und muss demnächst eine Aufgabe abgeben, leider komme ich dabit noch nicht so ganz zurecht und hoffe auf eure Hilfe.

Ich muss eine Freispeicherliste implementieren.
Dabei soll der Heap durch ein ausreichend großes Byte-Array "memPool" simuliert werden:


char memPool[MEM_POOL_SIZE];



Die freien Blöcke sollen über eine einfach verlinkte Liste verwaltet werden. Dazu enthält jeder Block im simulierten Heap
am Anfang eine Verwaltungsstruktur, die die nutzbare Länge des Blocks (d;h. Gesamtlänge des Blockes minus Länge der
Verwaltungsstruktur; in Bytes) und einen Zeiger auf den Anfang des nächsten freien Blocks enhält:


typedef struct MemBlock {
size_t size;
struct MemBlock *next;
} MemBlockT;



Der next-Pointer des letzten Blocks ist ein Null-Pointer.
Der Pointer freeMem (Typ: MemBlockT*) zeigt auf den Anfang der Freispeicherliste.
Belegte Blöcke sollen nicht in der Freispeicherliste verwaltet werden, sie behalten aber ihre Verwaltungsstruktur am Anfang des
Blockes. Um belegte Blöcke extra kenntlich zu machen, soll der next-Pointer belegter Blöcke den „magischen“ Integerwert
0xacdcacdc enthalten.


Nun habe ich bis jetzt folgendes zustande gebracht und weiß einfach nicht was ich als nächstes tun soll,
wenn ich die Malloc hinbekommen würde wäre ich schon ein Stückchen weiter. Vielleicht sehe ich den Wald vor lauter Bäumen nicht ...

Fehler erhalte ich nicht, jedoch erhalte ich auch nicht das richtige Ergebnis :(



extern char memPool[MEM_POOL_SIZE];
extern struct MemBlock *freeMem = 0;
unsigned int heap_size;

void initHeap(void) {

freeMem =(struct MemBlock *) memPool; /* zeigt auf Start der Liste */
freeMem->size = sizeof(memPool); /* gleichbedeutend mit MEM_POOL_SIZE */
freeMem->next = 0;

return;
}

void *myMalloc(size_t size) {

/* INIT HEAP */
heap_size = MEM_POOL_SIZE;
static int heap_inited = 0;
if(!heap_inited) {
heap_inited = 1;
initHeap();
}

int malloc_size = sizeof(size) + sizeof(freeMem);
struct MemBlock *curr = freeMem;
struct MemBlock *next = NULL;

while(curr) {

if(curr->size >= malloc_size) {

curr->size = malloc_size;
curr->next = curr + malloc_size;

// INIT NEXT BLOCK
next = curr->next;
heap_size -= malloc_size;
next->next = NULL;
next->size = heap_size;
free(next);

curr = curr + sizeof(struct MemBlock);
print_heap_allocations();
return curr;
}

curr = curr->next;
}

return NULL;

}

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
terraNova
08.11.2014, 12:07

Ich bin noch halb im Autopilot, von daher kann ich total falsch liegen, allerdings scheint es mir offensichtlich, dass Du mit den Größen ein wenig herumgeschludert hast.

Aktuell sieht es so aus das Du den Blöcken jeweils immer exakt 8 Bytes an Speicher zuteilst. malloc_size gibt momentan nur die Größe der Verwaltungsstruktur für jeden Block an (btw;: sizeof(struct MemBlock) ist da etwas eleganter). Das ist eigentlich auch ausreichend da Du ja mit size (dem Funktionsargument von myMalloc) schon die Blockgröße hast, überarbeite also diese Teile und Du solltest deine erwarteten Ergebnisse bekommen.

Etwas anderes: Sicherheit- und Algorithmenchecks und dergleichen.
1. Am Anfang solltest Du ganz simpel überprüfen ob es überhaupt noch genug Speicher gibt das Du zurückgeben könntest oder nicht. 2. Entweder rufe immer initHeap() auf und mach dort die static-checks ob alles initiiert wurde und lasse myMalloc() frei davon oder schreibe eine Macro und deklariere eine globale Variable und regel das so, was sogar noch besser wäre da andere Funktionen so die Möglichkeit besäßen zu gucken ob alles i;O. ist oder nicht und bei etwas so essentiellem wie einem Heap machen globale Variablen auch nichts aus.

Hoffe die Antwort kam rechtzeitig genug damit.

Viel Erfolg und so


Ähnliche Themen zu C Heap mit Char simulieren
  • [C/C++] char *Test = new char[20]; int Size1 = sizeof(Test); int Size2 = sizeof(*Test);
    Tja ich hoffe, die Überschrift sagt viel... char *Test = new char[0]; cout << "sizeof *Test: " << sizeof(*Test); cout << endl << "sizeof Test: " << sizeof(Test); Wirft sizeof *Test: 1 sizeof Test: 4 aus... Das erste Ergebnis ist eindeutig das Ergebnis, eines einzigen Chars, ist aber bei einem 20 [...]

  • The O.C: imogen heap - hide and seek
    bei welcher/welchen folgen kahm das lied??? hat da einer nen plan? welche lieder ausser "halleluja" kahmen noch von imogen heap? einfach echt krasse lieder und echt tief. thx 4 antwort. [...]

  • [Artwork] heap of diamonds
    ja.. hatte lust mal wieder zu smudgen und da ich farben liebe.... =) 15786 hoffe auf viele comments! danke lg [...]

  • [.NET] heap vs stack
    hi, ich habe ein kleines problem und zwar weiß ich nicht genau was wo gespeichert wird. im stack wird gespeichert: addresse der referenz werte von value types variablen im heap wird gespeichert : Objekte Wert der Referenz jetzt die frage, wo werden klassen und methoden gespeichert? und wo abg [...]



raid-rush.ws | Imprint & Contact pr