Aufgabe 4: Anfänger

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 4: Anfänger
so, ganz traditionell öffne ich den Anfänger- Thread :smiley:

Ich hab da ein Problemchen mit mbt_test() (hoffentlich bin ich da nicht der einzige)… mbt_test fordert absichtlich mehr als 1 Megabyte. Mein malloc prüft die Größe, setzt errno und gibt NULL zurück, und damit wird der Test sofort beendet. Sollte ich da etwa weiter machen, seblst wenn man mehr als 1 megabyte anfordert?


Na das passt doch eingentlich. Viel anders mach ich es auch nicht.
Einfach an die Spezifikationen in der halde.h halten.


ich mach mal lieber im anfänger thread weiter g,
hab a kleines problem: obwohl ich die unistd.h schon included hab, kommt noch immer foldende fehlermeldung:

halde.c: In function ‘malloc’:
halde.c:36: warning: implicit declaration of function ‘sbrk’

kann mir jemand nen tipp geben? thx g


Er kann die Funktion nicht finden.
Demnach hast du wahrscheinlich vergessen etwas einzubinden.
“Kontaktieren sie die Man Page ihrer Wahl für weitere Informationen.” g

EDIT: @wawi: Oder so, dann kann er sie natürlich auch nicht finden.


sbrk ist nicht im POSIX-Standard. brk und sbrk sind Unix spezifisch.

#
# sbrk(2) is not in POSIX. We need _XOPEN_SOURCE=500.
#
CFLAGS = -ansi -g -pedantic -Wall -Werror -D_XOPEN_SOURCE=500

Wenn Du jedoch das Makefile aus /proj/i4sos/pub/aufgabe4 benutzt, wie in der
Aufgabenstellung beschrieben, dann sollte es dieses Problem nicht geben. :wink:


seh ich das richtig das wir wenn wir 1MB vom BS holen, können wir maximal 1MB -16Byte allocieren, da wir ja diese zwei verwaltungs strukturen brauchen. Meine eigentliche frage ist, wenn ich einen Block free(), und dann ist ja da sagen wir mal 10Byte speicher, kann ich dann in diesen block nur noch 2 Byte effektiv speichern da ich 8 Byte für die struct mblock brauche, oder mal so (:D) wenn ich in disen block 10 Byte reinstecken will kann ich das dan so machen das ich danach keine verwaltungsstrucktur einsetzte (obwohl mir jetzt selber nicht so ganz klar ist wie ich das dann machen soll :smiley: mit dem verlinken :D)


Du kannst dann maximal 1MB-8Byte allokieren, das waere der maximale Block und die Liste ist dann leer. Wenn es keinen Block gibt braucht man auch keine Verwaltungsstruktur.

Wenn der Anwender malloc(10) macht und damit 10 Byte anfordert musst Du ihm natuerlich dann auch soviel geben, von der internen Verwaltungsstruktur weiss der Anwender nichts. Intern brauchst Du dafuer dann natuerlich 18 Byte speicher um die Struktur noch unterbringen zu koennen. Wenn Du keine 18 Byte hast kannst Du der Anforderung nicht nachkommen.


okay dann passt meine jetzige implementierung, danke für die flotte antwort :smiley:


schreibt calloc 0 oder ‘’ in den reservierten speicher.


calloc schreibt 0 (also den Wert wo alle bits 0 sind, nicht etwa das Zeichen ‚0‘) - was sollte denn bitte ‚‘ sein? ‚Leeres Zeichen‘?


das is ja genau das problem, ich benutze das makefile aus /proj/i4sos/pub/aufgabe4/ und die man page von sbrk sagt mir dass ich die <unistd.h> einbinden muss, was ich auch schon getan hab…


‚‘ war eingentlich \ 0 (backslash 0)


bitte löschen hab mich verklickt :smiley:


[m]0[/m] und [m]‘\0’[/m] sind genau identisch.
P.S. Verdammte ‘intelligente’ Forensoftware! :wink: Das hier muss man eingeben, damit man “Backslash Null” erhält: [m]\00[/m]


ja das hab ich auch im nachhinein gemerkt, naja alles von informatikern erstellt dat kann ja net gut gehen, (ja du hat natürlich recht das 0 und \0 das gleiche sind, ich hab eigntlich mehr an die ‚0‘ im ascii gedacht was aber ein schmarn ist !


mein problem hat sich durch einen OS wechsel erübrigt…jetzt gehts, trotzdem danke!


Jetzt laeft memstress wnigstens in Level 2 durch. Allerdings kommt noch ein Speicher zurueck bei einem malloc-Aufruf mit -1 und -2. Das erstaunt mich etwas, da ich ja teste, ob genugend Speicher vorhanden ist und -1 oder -2 doch weit ueber 1024 * 1024 - 8, was ja 2 hoch 11 - 2 hoch 3 sein sollte, liegen sollte, oder etwa nicht? Leider schmeisst mein Programm in Level 3 einen Speicherzugriffsfehler und jetzt meine Frage: wie rufe ich denn gdb oder ddd auf mit memstress 3 auf? Also gdb memstress 3 mag er nicht. Eine dumme Frage ich weiss, aber es waere trotzdem sehr hilfreich zu wissen. :listen:


Ganz einfach: dem run-Befehl im gdb die Parameter übergeben.


Ich wusste doch das es eine dumme Frage war Danke :smiley: