Нельзя обратиться к полям структуры после realloc

После realloc() нельзя обратиться к полям структуры

Вот, что говорит gdb:

(gdb) print flights

$2 = (flight *) 0x8d2220

(gdb) print flights[1]

$3 = {id = 137, quantityPassengers = 3, from = 0x8d22a0 "Anor Londo", target = 0x8d22e0 "London",
  plane = 0x8d2320 "Plane1", relevant = 0 '\000'}

(gdb) print flights[0]

$4 = {id = -1163005939, quantityPassengers = -1163005939,
  from = 0xbaadf00dbaadf00d <error: Cannot access memory at address 0xbaadf00dbaadf00d>,
  target = 0xbaadf00dbaadf00d <error: Cannot access memory at address 0xbaadf00dbaadf00d>,
  plane = 0xbaadf00dbaadf00d <error: Cannot access memory at address 0xbaadf00dbaadf00d>, relevant = 13 '\r'}

...

(gdb) print flights

$5 = (flight *) 0x8d2360
(gdb) print flights[2]

$6 = {id = 5051, quantityPassengers = 18, from = 0x8d2410 "Where", target = 0x8d2450 "None",
  plane = 0x8d2490 "Plane2", relevant = 1 '\001'}

(gdb) print flights[1]

$7 = {id = -1163005939, quantityPassengers = -1163005939,
  from = 0xbaadf00dbaadf00d <error: Cannot access memory at address 0xbaadf00dbaadf00d>,
  target = 0xbaadf00dbaadf00d <error: Cannot access memory at address 0xbaadf00dbaadf00d>,
  plane = 0xbaadf00dbaadf00d <error: Cannot access memory at address 0xbaadf00dbaadf00d>, relevant = 13 '\r'}

(gdb) print flights[0]

$8 = {id = -1163005939, quantityPassengers = -1163005939,
  from = 0xbaadf00dbaadf00d <error: Cannot access memory at address 0xbaadf00dbaadf00d>,
  target = 0xbaadf00dbaadf00d <error: Cannot access memory at address 0xbaadf00dbaadf00d>,
  plane = 0xbaadf00dbaadf00d <error: Cannot access memory at address 0xbaadf00dbaadf00d>, relevant = 13 '\r'}
flight* FormAndInputFlights(int *n)
{
    int i;
    char END;
    flight *flights = NULL;
    flight *buff = NULL;
    *n = 0;
    do
    {
        buff = flights;
        flights = (flight*)realloc(flights, ((*n)+1) * sizeof(flight));
        if(flights != NULL)
        {
            printf("\n\n\n");
            flights[*n] = FormAndInputFlight();
            printf("\n\n%d | %s\n", flights[*n].id, flights[*n].from);// Это работает
            if(*n > 0)
                printf("\n\n%d | %s\n", flights[(*n)-1].id, flights[(*n)-1].from); //Это не работает
            (*n)++;
            printf("Do you want to continue? (0 = NO and 1 = YES): ");
            fflush(stdin);
            scanf("%d", &END);
            END = !END; // =(
        }
        else
        {
            printf(ERRORallocateFlights);
            FreeFlights(&buff, *n);
            END = 1;
        }
    }while(!END);
    return flights; //Если убрать все printf, то тут flights = NULL
}

Ответы (1 шт):

Автор решения: AlexGlebe

Я нашёл только scanf("%d", &END); - даёт предупреждение на неправильный тип. Поменяйте на "%hhd". Вдруг поможет. Переменная flights - портится.

→ Ссылка