每次尝试运行案例时,我都会退出(1)(如果分配中有错误)1。我没有想法为什么,我可以得到一些帮助吗?
#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:
我删除了一些尚未用于缩短代码的结构和联合,我也会对房间进行分配,我认为这也是同样的问题。
答案 0 :(得分:1)
geraQuartos(qrt)导致堆栈溢出,因为夸脱只有1个入口加长但你在函数内写入第1~15个条目。 堆栈溢出会发生任何奇怪的事情。
答案 1 :(得分:1)
geraQuartos
中的quartos
循环将其参数视为指向15个hpd
结构数组的指针。但它只是指向一个结构的指针,因此它在对象的边界之外写作。这会导致未定义的行为,在这种情况下,它会覆盖NULL
,因此它不是realloc
。这会导致NULL
失败,因为第一个参数不是malloc
或先前由quart
返回的指针。
将quarto quart[15];
的声明更改为:
geraQuartos(quart);
然后执行:
crt.Screen.Send "cat myfile.txt | grep 'L[0-9]*' " & vbcr