【问题标题】:how to resolve "segmentation fault" error in "C" for list and file如何解决列表和文件的“C”中的“分段错误”错误
【发布时间】:2020-06-21 16:33:30
【问题描述】:

我的代码有一个大问题。

我找不到问题的解决方案。该代码适用于“Lista.h”文件。该列表是通过 flex 分析器和 bison 编译器读取一个 txt 文件来创建的。在“.c”文件和“.h”库的代码下方

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "Lista.h"

double search_CFU(char Cod_M);

Materia *lista;
Materia *ins_M(char cod_m, int anno_c, double CFU){
    Materia *c;
    c = (Materia *)malloc(sizeof(*c));
    c -> cod_m = cod_m;
    c -> anno_c = anno_c;
    c -> CFU = CFU;
}

Carriera *lista1;
Carriera *ins_s(char matr, int anno_c){
    Carriera *s;
    s = (Carriera*)malloc(sizeof(*s));
    s -> matr = matr;
    s -> anno_c = anno_c;
}


double Calc_M(char Cod_M, double voto){
    if(lista -> anno_c == lista1 ->anno_c){
        double num_CFU = search_CFU(Cod_M);
        lista1 -> prodotto = num_CFU * voto;
        lista1 -> CFU += num_CFU;
        lista1 -> num_e+1;
    }
}


double search_CFU(char Cod_M){
    while(lista != NULL){
        if(Cod_M == lista-> cod_m){
            return lista -> CFU;
        }
        else printf("Errore");
    }
}
void print(){
    Carriera *tmp = lista1;
    while(lista1 != NULL){
        printf("%d > %f > %d > %f,2", lista1 -> matr, lista1 -> CFU, lista1 -> num_e, lista1 -> prodotto/ lista1 -> CFU);
        lista = lista -> next;
    }
    lista1 = tmp;   
}

图书馆:

typedef struct c{ //corsi
    char cod_m;
    int anno_c;
    double CFU;
    struct c *next;
}Materia;

typedef struct s{  //studenti
    char matr;
    int anno_c;
    double CFU;
    double prodotto;
    int num_e;
    struct s *next; 
}Carriera;

Materia *ins_M(char cod_m, int anno_c, double cfu);
Carriera *ins_s(char matr, int anno_c);
double Calc_M(char cod_m, double voto);

输出是:分段错误。谢谢大家

更新:

我有一个新错误 用“-Wall -Werror”编译

错误是:

Carriera.c: In function ‘ins_M’:
Carriera.c:17:1: error: control reaches end of non-void function [-Werror=return-type]
   17 | }
      | ^
Carriera.c: In function ‘ins_s’:
Carriera.c:26:1: error: control reaches end of non-void function [-Werror=return-type]
   26 | }
      | ^
Carriera.c: In function ‘Calc_M’:
Carriera.c:37:1: error: control reaches end of non-void function [-Werror=return-type]
   37 | }
      | ^
Carriera.c: In function ‘search_CFU’:
Carriera.c:47:1: error: control reaches end of non-void function [-Werror=return-type]
   47 | }

谢谢

【问题讨论】:

  • Materia *ins_M(char cod_m, int anno_c, double CFU) 应该返回 Materia *,但实际上并没有返回任何东西。 Carriera *ins_s(...)double Calc_M(...)double search_CFU(char Cod_M) 相同。你的编译器没有给你任何警告吗?
  • 请包含一个小的 main() 函数,该函数使用此库来触发分段错误。
  • gcc -Wall -Werror编译。
  • @billLynch 主要在一个文件 bison ".y"
  • "我有一个新的错误,用 "-Wall -Werror"" 编译 - 这就是 -Werror 所做的:它将警告转换为错误,所以现在你不得不处理它们。

标签: c list coredump


【解决方案1】:

在编译代码时,gcc 会报告许多相关警告(您确实应该将其视为错误):

Lista.c:15:1: warning: control reaches end of non-void
      function [-Wreturn-type]
}
^
Lista.c:23:1: warning: control reaches end of non-void
      function [-Wreturn-type]
}
^
Lista.c:31:24: warning: expression result unused
      [-Wunused-value]
        lista1 -> num_e+1;
        ~~~~~~~~~~~~~~~^~
Lista.c:33:1: warning: control reaches end of non-void
      function [-Wreturn-type]
}
^
Lista.c:43:1: warning: control may reach end of non-void
      function [-Wreturn-type]
}
^

https://repl.it/repls/SilkySlowAdaware#Lista.c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多