#include <stdio.h>
#include <stdlib.h>
struct chambre {
int num;
struct chambre *prd;
struct chambre *svt;
};
typedef struct chambre chambre;
struct ascenseur {
char c;
struct chambre *etage;
struct ascenseur *etage_svt;
struct ascenseur *etage_prd;
};
typedef struct ascenseur ascenseur;
ascenseur *rdch = NULL;
ascenseur *Ajout_Etage(int up) {
ascenseur *new_Etage = NULL;
ascenseur *etage_up = rdch;
for (int i = 0; i < up; i++) {
etage_up = etage_up->etage_svt;
}
new_Etage = malloc(sizeof(ascenseur));
(etage_up->etage_svt)->etage_prd = new_Etage;
new_Etage->etage_svt = (etage_up->etage_svt);
new_Etage->etage_prd = etage_up;
etage_up->etage_svt = new_Etage;
new_Etage->c = 'X';
new_Etage->etage = malloc(sizeof(chambre));
chambre *p = new_Etage->etage;
p->num = 1;
p->svt = p;
p->prd = p;
chambre *nouv;
chambre *pre = p;
for (int i = 2; i < 6; i++) {
nouv = malloc(sizeof(chambre));
p->prd = nouv;
nouv->num = i;
nouv->prd = pre;
pre->svt = nouv;
pre = nouv;
}
return new_Etage;
}
int main() {
int i;
// ascenseur * rdch=NULL;
ascenseur *new_rdch, *rdch_prd;
rdch = malloc(sizeof(ascenseur));
rdch->c = 'A';
rdch->etage_prd = NULL;
rdch->etage_svt = NULL;
rdch->etage = malloc(sizeof(chambre));
chambre *p = rdch->etage;
p->num = 1;
p->prd = p;
p->svt = p;
//=============
chambre *nouv;
chambre *pre = p;
for (i = 2; i < 6; i++) {
nouv = malloc(sizeof(chambre));
p->prd = nouv;
nouv->num = i;
nouv->prd = pre;
pre->svt = nouv;
pre = nouv;
}
printf("%c -> : ", rdch->c);
printf("%d", p->num);
printf(" %d ", (p->svt)->num);
printf("\n_______________________ : \n");
//==================================================
rdch_prd = rdch;
for (int j = 1; j < 6; j++) {
new_rdch = malloc(sizeof(ascenseur));
new_rdch->c = 'A' + j;
new_rdch->etage_prd = rdch_prd;
new_rdch->etage_svt = NULL;
rdch_prd = new_rdch;
new_rdch->etage = malloc(sizeof(chambre));
p = new_rdch->etage;
p->num = 1;
p->prd = p;
p->svt = p;
//=============
pre = p;
for (i = 2; i < 6; i++) {
nouv = malloc(sizeof(chambre));
p->prd = nouv;
nouv->num = i;
nouv->prd = pre;
pre->svt = nouv;
pre = nouv;
}
printf("%c -> : ", new_rdch->c);
printf("%d", p->num);
printf(" %d ", (p->svt)->num);
printf("\n_______________________ : \n\n");
}
ascenseur *etage_up = Ajout_Etage(3);
printf("\n\n");
printf("%c ==> : ", etage_up->c);
// printf("%d ",(etage_up->etage)->num);
return 0;
}
我将
rdch
指针声明为用“NULL”初始化的全局 VAR。
之后,通过main
函数中的处理,rdch
指针现在有一个值(不是NULL)。
调试器在行中声明错误etage_up=etage_up-\>etage_svt;
我不知道函数“Ajout_Etage”是否将etage_up取为NULL那么etage_up的etage_svt不存在....所以如果我是对的,为什么
etage_up
取NULL值当rdch
main
函数中的进程指针采用真实地址和真实构建。
Ajout_Etage()
中出现段错误,因为 etage_up
为 NULL: for (int i = 0; i < up; i++) {
etage_up = etage_up->etage_svt;
}
up = 3
但etage_up
链表中只有 1 个节点。
&& etage_up
来解决上面的问题,那么出于同样的原因,它会在 (etage_up->etage_svt)->etage_prd = new_Etage;
中出现段错误。我不知道
Ajout_Etage(3);
是否为 up
使用了错误的值,或者您建立的状态不正确。事实上,它不是用英语写的,这让我更难帮助你。
当你使用调试器时,你不仅要尝试找出崩溃发生的where,还要尝试找出when。如果逐个语句进入代码,您应该注意到,是的,您在
etage_up = etage_up->etage_svt
上出错,但在循环的第二次迭代上出错。这意味着问题与rdch
(etage_up
指向的原始值)无关,而是与rdch->etage_svt
(第一次迭代后etage_up
指向的值)有关。
事实上,如果您在调试器中检查
rdch->etage_svt
,您会注意到它是 0,并且尝试取消引用它会导致崩溃。要解决您的错误,您需要将 rdch->etage_svt
分配给有效的东西。