Programm-Absturz nach Einbinden von malloc()
-
Ah, gute Idee!
floatMatrix MallocFloatMatrix(int zeilenAnz, int spaltenAnz) { float** t = calloc(zeilenAnz,sizeof(float*)); if (t == NULL){ printf("Boehse!"); free(t); exit (1); } int i; for(i = 0; i < zeilenAnz; i++){ t[i] = calloc(spaltenAnz, sizeof(float)); if (t[i] == NULL){ printf("Auch boehse!"); free(t); exit (1); } } return t; }
Reicht es im zweiten Fall (der for-Schleife) nur t freizugeben? Oder muß ich t[i] separat freigeben?
Blue][ce
-
Alle reserviertgen t[i].
-
Und zum Schluß auch das float** Array, also t.
-
Alles klar!
floatMatrix MallocFloatMatrix(int zeilenAnz, int spaltenAnz) { float** t = calloc(zeilenAnz,sizeof(float*)); if (t == NULL){ printf("Boehse!"); free(t); exit (1); } int i; int j; for(i = 0; i < zeilenAnz; i++){ t[i] = calloc(spaltenAnz, sizeof(float)); if (t[i] == NULL){ printf("Auch boehse!"); for(j = i; j == 0; j--){ free(t[j]); } free(t); exit (1); } } return t; }
Müßte dann so sein ...
Gruß,
Blue][ce
-
Na, das guck dir mal lieber in Ruhe noch einmal an
-
Ups...
for(j = i; j >= 0; j--){ free(t[j]); }
-
Jepp, schon besser. Man könnte sich noch fragen, ob ein free auf nen Nullzeiger anzuwenden sinnvoll ist. Beantwortet man die Frage mit nein, so streicht man die Zeile 5 und setzt die for-Schleife mit
for(j = i-1; ...; ...)
...
an.
Generell ist aber ein free(NULL) harmlos.
-
Das stimmt natürlich ... ist mir nicht aufgefallen.
Aber ich bin schließlich hier um was zu lernen!Werd das der Schönheit wegen ändern.
Also nochmal vielen Dank!
Gruß,
Blue][ce (der endlich registrierte ^^)
-
Tim schrieb:
VuuRWerK schrieb:
@Tim: Kannst Du Deine Aussage Begründen? Möglicherweise ist meine Aussage dahingehend "schwammig" das man es mit einem sizeof(int) vergleichen kann, ok mag doof aussehen. Aber 4Byte auf einem 32bit System sind nunmal 4Byte, sowohl ein int als auch ein jeder Pointer.
Ich widerlege durch Gegenbeispiel: http://focus.ti.com/lit/ug/spru514c/spru514c.pdf (Seite 82)
Ansonsten kannst du ja gerne mal deine Behauptung zu belegen versuchen
Edit: Vielleicht nicht ganz hundertprozentig sauber, da da wohl ein Vertipper im Manual vorliegt (pointers: 32Bit mit 0xFFFF als Maximum macht nicht viel Sinn), aber es sollte reichen deine Aussage zu überdenken
Ein schönes Beispiel sind auch die 16Bit x86 CPUs, bzw. die neuerem in diesem Kompatibilitätsmodus dazu. Dort sind die Register 16Bit breit, aber man hat 20Bit Adressleitungen und dementsprechend reicht ein einzelnes Register zur Adressierung nicht mehr aus