problem mit malloc



  • Descartes: Wenn der Compiler den Rückgabetyp nicht kennt, nimmt er int an, und nicht void*. Ausserdem kennt er ihn, schließlich ist stdlib.h eingebunden (malloc.h gibt es in ANSI-C nicht)
    Der Fehler ist schlicht und ergreifend, dass hier ein C++ Compiler benutzt wurde, um ein C-Programm zu übersetzen.

    -und 2. ist da snicht falsch wenn man Platz für short werte reserviert, der zeiger aber vom typ float ist ? wenn für 5 werte dann 10 bytes reserviert werden springt der zeiger doch immer 4 bytes weiter und bräuchte 20 bytes oder nicht ?

    jepp, das ist falsch. Das Feld ist zu klein, das Programm funktioniert nur zufällig.



  • Bashar schrieb:

    Descartes: Wenn der Compiler den Rückgabetyp nicht kennt, nimmt er int an, und nicht void*. Ausserdem kennt er ihn, schließlich ist stdlib.h eingebunden (malloc.h gibt es in ANSI-C nicht)

    Stimmt, hatte den inkludierten stdlib.h Header übersehen. Wie kam ich bloss auf "malloc.h"? *grübel*



  • wegen dem zu kleinem feld:

    es funzt aber,auch mit short... oder wie kann ich das testen ? Ist denn short definitiv falsch ?



  • descartes...weil die irgendwie bei jedem win compiler dabei zu sein scheint 😉 und da steht auch die def. malloc drin (und noch andere dinge)

    tschöö

    tt



  • also irgendwie verstehe ich das nicht. trotzt short in malloc läuft es problemlos,und selbst wenn ich free nicht aufrufe und da sprog 2 mal durhclaufe werden wieder fie gleiche speicherplätze belegt,kann doch nicht sein,weil nicht freigegeben ?!



  • deejay ray schrieb:

    also irgendwie verstehe ich das nicht. trotzt short in malloc läuft es problemlos

    noch. Nirgends steht, dass ein Programm abstürzen muss, wenn du sowas machst. Es kann auch falsche Ergebnisse bringen, sonstigen Unfug machen, oder eben doch genau das erwartete tun. Aber verlasse dich niemals darauf ... irgendwann debuggst du dir nen Wolf.

    ,und selbst wenn ich free nicht aufrufe und da sprog 2 mal durhclaufe werden wieder fie gleiche speicherplätze belegt

    Woher weißt du das? BTW könntest du dir bitte die Mühe machen, und ein wenig auf deine Tippfehler achten?



  • Ich weiss das weil ich die belegten Speicheradressen mit ausgeben lasse.



  • Speicheradressen sind relativ. Jeder Prozess hat auf modernen OS einen eigenen Adressraum, der vom Betriebssystem irgendwie in den physischen Arbeitsspeicher eingeordnet wird. Von daher wirst du wahrscheinlich sogar, wenn du das Programm 20mal gleichzeitig startest, 20mal die gleiche Adresse ausgegeben bekommen.



  • ja,mag ja sein, aber nicht wenn ich diesen Bereich nicht wieder freigebe !?



  • Da das OS deinem Programm jedesmal einen neuen Adressraum zuordnet und den so gestaltet das er für das Programm linear ist, schreibst du logisch auf dieselbe SpeicherAdresse aber wo diese Speicherstelle physikalisch im RAM liegt hast du keinen Einfluß.

    Zweitens die meisten Compiler sorgen beim Verlassen des Programms dafür das aufgeräumt wird.

    Drittens Gute OS und auch windows wissen welchen physikalischen Speicher sie dem Programm zugeordnet haben und geben den gesamten zugeordneten Speicher wieder frei wenn der Process (das Programm) beendet wird, somit ist auch der von die fälschlicherweise nicht freigegeben Speicher wieder freigegeben. Das heißt aber nicht, das weil ja das OS aufräumt man kein free mehr machen muss.

    Bashar meinte das du logisch 20 mal diegleiche Speicherstelle ausgeben kannst, aber nicht dieselbe weil sie durch das OS für jedes Programm an eine andere Stelle gemappt wird.


Anmelden zum Antworten