Dynamisch wachsende Liste
-
Ich versuche gerade, eine dynamisch wachsende Liste zu programmieren, bei der ich beliebig Elemente hinzufügen kann. Beim Beenden des Programmes bekomme ich allerdings eine Fehlermeldung, ich vermute mein Code schreibt in einen unzulässigen Speicherbereich, konnte den Fehler aber nicht finden.
typedef struct { // elements vector3f *data; // number of elementes unsigned int count; // memory allocated in elementes unsigned int alloc; } Vector3List; // Neue liste erstellen Vector3List *Vector3ListNew() { Vector3List *tmp; tmp = malloc(sizeof(Vector3List)); tmp->count = 0; tmp->data = NULL; tmp->alloc = 0; return tmp; } // Liste löschen void Vector3ListDelete(Vector3List *list) { if (list == NULL) return; if (list->data != NULL) free(list->data); free(list); } // Element zu Liste hinzufügen void Vector3ListAdd(Vector3List *list, vector3f vec) { if (list == NULL) return; list->count++; if (list->count > list->alloc) { if (list->alloc <= 0) list->alloc = 1; else list->alloc *= 2; list->data = realloc(list->data, list->alloc * sizeof(vector3f)); } *(list->data + (list->count - 1) * sizeof(vector3f)) = vec; } vector3f *Vector3ListGet(Vector3List *list, unsigned int index) { if (list == NULL) return NULL; if (index < 0) return NULL; if (index > list->count - 1) return NULL; return (list->data + sizeof(vector3f) * index); }
Kann mir jemand sagen ob hier ein Fehler vorliegt? Wäre sehr dankbar dafür!
-
Sag doch erst mal, welche Fehlermeldung du bekommst...
-
Beim Beenden des Programmes bekomme ich einen segmentation fault. Dabei wird allerdings die Liste nicht mehr benutzt, sondern nur einige andere Sachen freigegeben. Ich vermute, dass beim Benutzen der Liste irgendwo ein anderer Speicherbereich überschrieben wird, den ich am Programmende nutze, aber ich finde den Fehler leider nicht ...
-
realloc() garantiert nicht, daß die Daten im alten Speicherbereich noch gültig sind.
Vermutlich stimmen dann die ganzen Zeiger nicht mehr und zeigen auf "gefreetes" Memory.
Klar crasht das dann ...
-
Hmm, Du verwirrst den Leser ziemlich durch ständige <0-Vergleiche bei unsigned-Werten und deine Arrayreferenzierungssyntax ist auch eigenwillig ...
Kann es aber sein, daß Du ein realgelockten Zeiger irgendwo behältst, dann umreallocst und dann referenzierst?