010
29.10.2004, 22:25 Uhr
(un)wissender
Niveauwart
|
? Das haben wir doch gerade getan! Dein korrierter Code belegt korrekt den Speicher (unter der Voraussetzung, das malloc nicht 0 liefert). Und entweder wir machen das richtig, oder gar nicht, dann musst du das alleine tun. Fox, etwas zu programmieren ist nicht mal eben schnell gemacht, das erfordert Geduld und Übung.
Ein generischer Ansatz, den du dann immer wieder korrekt verwenden kannst und ihn nur einmal schreiben musst, wäre das hier (ein wenig Objektorientierung kann c nicht schaden):
C++: |
#include <stdlib.h> #include <stdio.h>
//Datenstruktur typedef struct { char ** data; int x,y; } TwoDCharArray;
//Methodendeklarationen int init2D(TwoDCharArray *, int, int); //Speicher holen
//Die müssen wir noch machen...sind aber recht kurz int readElementAt2D(const TwoDCharArray *, int, int, char *); //aufs Feld zugreifen (lesen) int writeElementAt2D(TwoDCharArray *, int, int, char); //aufs Feld zugreifen (schreiben) int resizeXDim2D(TwoDCharArray *, int); //Vergößern int free2D(TwoDCharArray *); //Löschen
int main(void) { TwoDCharArray array; if(init2D(&array, 3, 4)) { printf("Init successful!\n"); } else { printf("Init not successful!\n"); } return 0; }
int init2D(TwoDCharArray * array, int x, int y) { int counter = 0; array->data = malloc(x * sizeof(char*)); if(!array->data) { return -1; //Keinen Speicher bekommen, Fehler }
while(counter < x) { array->data[counter] = malloc(y * sizeof(char)); if(!array->data[counter]) //Keinen Speicher bekommen { while(--counter >= 0) //Speicher wieder freigeben, sonst Speicherloch { free(array->data[counter]); }
free(array->data); array->data = NULL; //Sicher ist sicher, bei Zugriffen gibt es jetzt sofort Ärger. return -1; } ++counter; } array->x = x; array->y = y; return 1; }
|
Wenn jemand noch Fehler findet, bitte melden! -- Wer früher stirbt ist länger tot. Dieser Post wurde am 29.10.2004 um 22:40 Uhr von (un)wissender editiert. |