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?


Anmelden zum Antworten