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