这个C代码在我运行时声明了一个错误(segfault)

问题描述 投票:0回答:2
#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
函数中的进程指针采用真实地址和真实构建。

c data-structures segmentation-fault doubly-linked-list
2个回答
0
投票
  1. 您的程序在
    Ajout_Etage()
    中出现段错误,因为
    etage_up
    为 NULL:
    for (int i = 0; i < up; i++) {
        etage_up = etage_up->etage_svt;
    }

up = 3
etage_up
链表中只有 1 个节点。

  1. 如果你添加一个
    && etage_up
    来解决上面的问题,那么出于同样的原因,它会在
    (etage_up->etage_svt)->etage_prd = new_Etage;
    中出现段错误。

我不知道

Ajout_Etage(3);
是否为
up
使用了错误的值,或者您建立的状态不正确。事实上,它不是用英语写的,这让我更难帮助你。


0
投票

当你使用调试器时,你不仅要尝试找出崩溃发生的where,还要尝试找出when。如果逐个语句进入代码,您应该注意到,是的,您在

etage_up = etage_up->etage_svt
上出错,但在循环的第二次迭代上出错。这意味着问题与
rdch
etage_up
指向的原始值)无关,而是与
rdch->etage_svt
(第一次迭代后
etage_up
指向的值)有关。

事实上,如果您在调试器中检查

rdch->etage_svt
,您会注意到它是 0,并且尝试取消引用它会导致崩溃。要解决您的错误,您需要将
rdch->etage_svt
分配给有效的东西。

© www.soinside.com 2019 - 2024. All rights reserved.