错误"分段错误(核心转储)",哪里出错?

时间:2014-08-24 10:28:20

标签: c

练习要求制作一个管理剧院的功能:我想要一个链式列表,其中每个元素都是(观众的)一行,其中有免费座位数(在该行中)和每个座位的子列表。这是我制作列表的功能,错误在哪里?

struct posto {
  int stato;
  struct posto *next;
};

typedef struct posto Posto;
typedef struct posto *PuntatorePosto;

struct fila {
  int numero;
  PuntatorePosto Lista;
  struct fila *next;
};

typedef struct fila Fila;
typedef struct fila *PuntatoreFila;

typedef enum {
  false,
  true
} Boolean;

struct fila *crealista() {
  struct fila *p, *ultimo, *ultimino;
  struct posto *p1, *p2;
  int i, j, n, m;

  do {
    printf("\t\t\tCreazione della lista\n\nDa quante file %c composta la "
           "platea ? ",
           138);
    scanf("%d", &m);
    printf("Quanti posti per fila ? ", 138);
    scanf("%d", &n);
  } while (n < 0);

  if (n == 0)
    p = NULL; /* lista vuota */
  else {

    p = (struct fila *)malloc(sizeof(struct fila));
    ultimo = p;
    ultimo->numero = 1;

    for (i = 2; i <= m; i++) {
      ultimo->next = (struct fila *)malloc(sizeof(struct fila));
      ultimo = ultimo->next;
      ultimo->numero = i;
    }
    ultimo->next = NULL;

    ultimino = p;
    p2 = ultimino->Lista->next;
    for (i = 1; i <= m; i++) {

      printf("Fila %d posto 1", i);
      scanf("%d", &p2->stato);
      for (j = 2; j <= n; j++) {
        p2->next = (struct posto *)malloc(sizeof(struct posto));
        p2 = p2->next;
        printf("Fila %d posto %d", i, j);
        scanf("%d", &p2->stato);
      }
      ultimino = ultimino->next;
      p2 = ultimo->Lista->next;
    }
    ultimino->next = NULL;
  }
  return (p);
}

2 个答案:

答案 0 :(得分:2)

好主意是在调试器或内存访问验证器中运行程序。

一个选项是gdb,可以使用命令gdb ./yourprogaram启动。接下来,您必须使用命令运行开始运行它。稍后您可以查看崩溃的回溯并读取程序存储器中的变量。

另一个选项是valgrind,它执行内存访问检查并打印有关错误的有用信息。

掌握调试工具对程序员来说是一项非常重要的技能。这就是为什么最好从一开始就在简单的程序上尝试它们。

答案 1 :(得分:0)

您尚未初始化Lista,这可能是您的段错误的原因。添加一些标题(#include <stdio.h>#include <stdlib.h>)并使用调试符号和警告(以及main函数)重新编译它:

cc -Wall -Wextra -g yourfile.c -o yourfile

然后使用gdb进行调试:

gdb -q -ex r ./yourfile