2016-06-28 14 views
0

Mein Programm stürzt mit einem Fehler ab, der mit einem ungültigen Heap-Zeiger zusammenhängt. In der ersten Funktion weise ich 5 Zellen zu und zeige mit "snake_head" auf das erste Element in der Liste, und "snake_tail" zeigt auf das letzte Element. In der zweiten Funktion versuche ich, das letzte Element aus der Liste zu befreien und schlange_schwanz zur nächsten Zelle in der Liste zu bewegen. Beim schlange_schwanz ist etwas schief gelaufen. Ich verstehe nicht, was es ist.CrtIsValidHeapPointer-Fehler beim Versuch, ein Element einer verknüpften Liste freizugeben

#include <stdio.h> 
#include <stdlib.h> 

typedef struct pos_s { 
    unsigned int x; 
    unsigned int y; 
}pos_t; 


typedef struct snake_cell_s { 
    pos_t pos; 
    struct snake_cell_s* next; 
    // struct snake_cell_s* prev; 
} snake_cell_t; 



void init_snake(snake_cell_t** snake_head, snake_cell_t** snake_tail) 
{ 
    int i; 
    const int init_snake_size = 5; 
    unsigned int init_snake_x = 5; 
    unsigned int init_snake_y = 5; 

    *snake_head = (snake_cell_t*)malloc(sizeof(snake_cell_t)*init_snake_size); 
    snake_cell_t* snake_cell[init_snake_size]; 

    for (i = 0; i<init_snake_size; ++i) { 
     snake_cell[i] = (*snake_head) + i; 
     snake_cell[i]->pos.x = init_snake_x + i; 
     snake_cell[i]->pos.y = init_snake_y; 

     if (i<init_snake_size - 1) { 
      snake_cell[i]->next = *snake_head + i + 1; 
     } 
     else { 
      snake_cell[i]->next = NULL; 
     } 
    } 
    *snake_tail = snake_cell[init_snake_size - 1]; 
    (*snake_tail)->next = NULL; 
} 




snake_cell_t* advance_snake_tail(snake_cell_t* snake_head, snake_cell_t* snake_tail) 
{ 
    snake_cell_t* snake_new_tail; 
    snake_cell_t* snake_cell = snake_head; 

    while (snake_cell->next->next != NULL) 
    { 
     snake_cell = snake_cell->next; 
    } 

    snake_new_tail = snake_cell; 
    snake_new_tail->next = NULL; 
    free(snake_tail);  // < ---- crash happens here 
    return snake_new_tail; 
} 







int main() 
{ 
    snake_cell_t* snake_head = NULL; 
    snake_cell_t* snake_tail = NULL; 
    init_snake(&snake_head, &snake_tail);  // create a 5 cell snake list 
    snake_tail = advance_snake_tail(snake_head, snake_tail); // update snake tail- remove last cell and move pointer to previous cell 
    return 0; 
} 
+0

und was hat der Debugger gesagt? –

+0

Debug-Assertion fehlgeschlagen! Programm: ... 15 \ Projects \ ConsoleApplication1 \ Debug \ ConsoleApplication1.exe Datei: minkernel \ CRTs \ ucrt \ src \ appcrt \ Haufen \ debug_heap.cpp Line: 888 Expression: _CrtIsValidHeapPointer (Block) – sergeyrar

+2

Du bist 'Einen Zeiger freimachen, der von' malloc' nicht zurückgegeben wurde. – immibis

Antwort

0

Sie sind free einen Zeiger ing, die nicht von malloc zurückgegeben wurde. - immibis

Verwandte Themen