2016-04-14 4 views
-1

Я получаю выход (1) (если есть некоторая ошибка в распределении) каждый раз, когда я пытаюсь запустить случай 1. И у меня нет идеи, почему, могу ли я получить некоторую помощь?Динамическое расположение в c не работает

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

typedef struct hospede{    //guest 
    int numreg;  //register num 
    char nome[80]; 
    int acompanhante; //n of ppl 
    int dias; //time to stay 
    estado tabela; 
}hospede; 

typedef struct quarto{   //room 
    int num; //num do quarto 
    char categoria;  //[S] ou [F] 
    char status;  //[L] ou [O] 
    estado stats; 
    }quarto; 

void alocaHospede(hospede **hosp, int tam); 
void alocaQuartos(quarto **quar, int tam); 
void geraQuartos(quarto *quar); 
void checkIn(hospede *hosp, int tam); 

int main() 
{ 
    hospede *hpd = NULL; 
    quarto *qrt = NULL; 
    quarto quart; 
    int qtd = 0; 
    char op; 
    int x; 

    qrt = &quart; 
    geraQuartos(qrt); 
    do{ 
     printf("\n1-CheckIn\n>"); 
     scanf("%i", &x); 
     fflush(stdin); 
     switch(x){ 
     case 1: 
      alocaHospede(&hpd, qtd+1);  
      checkIn(hpd, qtd); 
     } 
     printf("\nDeseja continuar? \n"); 
     scanf("%c", &op); 
     fflush(stdin); 
    }while(op!='n' && op!='N'); 

    return 0; 
} 
void checkIn(hospede *hosp, int tam){ 
    printf("\nwork\n"); 
}//checkIn 
void alocaHospede(hospede **hosp, int tam){ 
    *hosp = (hospede*)realloc(*hosp, tam*sizeof(hospede)); 
    if(*hosp == NULL) 
     exit(1); 
}//aloca hospede 

void alocaQuartos(quarto **quar, int tam){ 
if((*quar = (quarto *) realloc(*quar, tam * sizeof(quarto)))== NULL) 
    exit(1); 
}//alocaQuartos 


void geraQuartos(quarto *quar){ 
    int i; 
    for(i=0;i<15;i++,quar++){ 
     (*quar).num = i+1; 
    } 
}//geraQuartos 

OBS:

Я Удалены некоторые структуры и объединения, которые не используются до сих пор, чтобы сделать код короче, и я буду делать выделение в помещения, а также, я думаю, что это то же самое проблема.

ответ

1

Петля for в geraQuartos обрабатывает свой аргумент как указатель на массив из 15 quartos структур. Но это указатель на одну структуру, поэтому он записывается за пределы объекта. Это вызывает неопределенное поведение, и в этом случае он переписывает hpd, поэтому это не NULL. Это приводит к ошибке realloc, потому что первым аргументом является не NULL или указатель, который ранее возвращался malloc.

Изменить декларация quart к:

quarto quart[15]; 

, а затем сделать:

geraQuartos(quart); 
+0

большое спасибо, отличное объяснение также! –

1

geraQuartos (qrt) вызывает переполнение стека из-за того, что quart имеет только 1-позицию-отсрочку, но вы записываете 1-ю 15-ю записи внутри функции. Что-то странное может произойти при переполнении стека.