找不到分割错误所在的位置

问题描述

| 我已经进行了一段时间编程,虽然不是很多,但是对于我来说,很难找到分段错误的所在,已经尝试了几乎所有的方法:(。这是针对学校项目的,教师不需要通常在这件事上有帮助。 好吧,这里是代码
#include \"funcoes2.h\"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

listaa total_aero = NULL;

void guarda_voo()
{
    listaa t; /* struct list of airports */
    voo novo_voo;
    aeroporto novo_aeroporto1;
    aeroporto novo_aeroporto2;


    scanf(\"%s %s %s %d:%d %s %f\\n\",novo_voo.codigo,novo_voo.aero_partida,novo_voo.aero_chegada,&novo_voo.hora_partida,&novo_voo.minuto_partida,novo_voo.hora_chegada,&novo_voo.preco);

    for(t=total_aero; t != NULL; t = t->prox){
        if(!strcmp(t->naero.codigo,novo_voo.aero_partida))
            break;
    }

    if(t == NULL){
        insere_aeroporto(total_aero,novo_aeroporto1); /* adds an airport to the list,I also think that it won\'t reach here when executing */
        strcpy(total_aero->naero.codigo,novo_voo.aero_partida);
        total_aero->naero.voos_SAEm++;
        strcpy(total_aero->naero.aero_barato,novo_voo.aero_chegada);
        strcpy(total_aero->naero.aero_tarde,novo_voo.aero_chegada);
        total_aero->naero.preco_barato=novo_voo.preco;
        total_aero->naero.hora_tarde=novo_voo.hora_partida;
        total_aero->naero.minuto_tarde=novo_voo.minuto_partida;
        total_aero->naero.situacao=\'a\';
        total_aero->naero.voos = NULL;
        insere_voo((total_aero->naero).voos,novo_voo);
        }
    else{
        t->naero.voos_SAEm++;
        if(novo_voo.preco < (t->naero.preco_barato)){
            t->naero.preco_barato=novo_voo.preco;
            strcpy(t->naero.aero_barato,novo_voo.aero_chegada);
        };
        if((t->naero.hora_tarde<novo_voo.hora_partida) || (t->naero.hora_tarde==novo_voo.hora_partida && t->naero.minuto_tarde<novo_voo.minuto_partida)){
            (t->naero.hora_tarde=novo_voo.hora_partida);
            (t->naero.minuto_tarde=novo_voo.minuto_partida);
            strcpy(t->naero.aero_tarde,novo_voo.aero_chegada);
        }
        insere_voo(t->naero.voos,novo_voo);
    }


    for(t=total_aero; t != NULL; t = t->prox){

        if(!strcmp(t->naero.codigo,novo_voo.aero_chegada)){
            t->naero.voos_chegam++;
            return;
        }
    }
预先感谢,如果不清楚的地方,请告诉我,我会尽力解释 我将.h文件在这里
 typedef struct _st_voo{
char codigo[7];
char aero_partida[4];
char aero_chegada[4];
int hora_partida;
int minuto_partida;
char hora_chegada[6];
float preco;
 }voo;



 struct nodev {
voo nvoo;
struct nodev *prox;
 };
 typedef struct nodev *listav;



 typedef struct _st_aeroporto{
char codigo[4];
int voos_SAEm;
int voos_chegam;
char aero_barato[4];
char aero_tarde[4];
float preco_barato;
int hora_tarde;
int minuto_tarde;
char situacao;
listav voos;
 }aeroporto;


 struct nodea {
aeroporto naero;
struct nodea *prox;
 };
 typedef struct nodea *listaa;



 void guarda_voo();

 void info_aeroporto();

 void insere_voo(listav x,voo novo_voo);

 void remove_voo(listav x,voo cancelado);

 void insere_aeroporto(listaa x,aeroporto novo_aero);
    

解决方法

您的代码输入一团糟。由于我们看不到所有代码或无法执行它们,因此不可能有人找到它。您有2个选择: 正确的方法:了解如何使用gdb调试代码:http://www.gnu.org/software/gdb/ 肮脏的方式:使用printf()将语句在代码的不同部分打印到控制台,以帮助您确定发生分段错误的位置和时间。     ,Valgrind是你的朋友。     ,啊,Google是您的朋友,但我会继续说:很明显,您需要调试器。如果您是在Linux或UNIX OS上运行此程序,则需要使用gdb(http://www.gnu.org/software/gdb/),而在Windows中,Visual Studio及其同胞将附带一个内置调试器。如果您要使用其中之一来查找分段错误,则无需花费时间。 对于GDB,可以从http://sourceware.org/gdb/current/onlinedocs/gdb/Sample-Session.html#Sample-Session获得调用示例,并且专门用于分段错误的链接位于以下链接:http:// www .unknownroad.com / rtfm / gdbtut / gdbsegfault.html。     ,在尝试使用strcpy或scanf复制到字符串之前,请检查是否已为字符串分配了空间。 如其他人所述,请使用调试器。如果您只是在调试器中运行直到失败,则可以查看回溯以查看导致失败的调用。 您可以使用printf语句来显示值-“可怜”的调试器,但是使用调试器可以更快地发现问题。