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;
}
und was hat der Debugger gesagt? –
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
Du bist 'Einen Zeiger freimachen, der von' malloc' nicht zurückgegeben wurde. – immibis