2016-07-30 17 views
1

Ich habe einen C++ Hintergrund und bin ein Neuling in C. Ich wollte einen generischen Vektor in C schreiben. Dinge waren in Ordnung, bis ich beschloss, eine freie Funktion hinzuzufügen, um jedes Element zu löschen. Aber jetzt stürzt das Programm beim Ausführen der free() Funktionen in vectorFree() ab.Warum verursacht dieser Code einen ungültigen Zeiger?

Ich habe noch keine freie Funktion getestet, ich übergebe NULL und der Vektor kann schon nicht funktionieren. Der Vektor funktionierte gut, bevor ich die Funktion für freie Funktionen hinzufügte. Hier

ist meine Codes, Ich lasse alle Kommentare und irrelevanten Codes:

vector.h

typedef void (*FreeFunction)(void *element); 

typedef struct Vector { 
    void *elements; 
    ... 
    FreeFunction freeFunc; 
} Vector; 

Vector* vectorAlloc(size_t elemSize, VectorFreeFunction freeFunc); 
void vectorFree(Vector *vector); 

... 

vector.c

Vector* vectorAlloc(size_t elemSize, VectorFreeFunction freeFunc) 
{ 
    Vector* vector = malloc(sizeof(vector)); 
    ... 

    vector->elements = malloc(elemSize * vector->capacity); 
    ... 

    vector->freeFunc = freeFunc; 
    return vector; 
} 

void vectorFree(Vector *vector) 
{ 
    if (vector->freeFunc != NULL) { 
     for (int i = 0; i < vector->size; i++) { 
      vector->freeFunc(vectorAt(vector, i)); 
     } 
    } 

    free(vector->elements); 
    free(vector); 
} 

... 

vectorTest.cpp

void test() 
{ 
    Vector* num = vectorAlloc(sizeof(int), NULL); 
    vectorFree(num); 
} 
+2

Wenn dies C ist, warum heißt Ihre Datei 'vectorTest.cpp'? – melpomene

Antwort

3

Diese Zeile ist a Problem, weil sie nicht über genügend Arbeitsspeicher zuweisen:

Vector* vector = malloc(sizeof(vector)); 

Es sollte entweder

Vector* vector = malloc(sizeof(Vector)); 

(mit Kapital V) oder

Vector* vector = malloc(sizeof(*vector)); 

(mit einem Stern *) sein.

+1

Im letzteren Fall brauchen Sie keine Parens: 'sizeof * vector'. – melpomene

+3

@melpomene Das stimmt. Allerdings verwende ich "sizeof" immer mit Klammern, auch wenn sie nicht benötigt werden - meistens für visuelle Konsistenz als alles andere. – dasblinkenlight

Verwandte Themen