如何解决列表和文件的“C”中的“分段错误”错误

Posted

技术标签:

【中文标题】如何解决列表和文件的“C”中的“分段错误”错误【英文标题】:how to resolve "segmentation fault" error in "C" for list and file 【发布时间】: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 所做的:它将警告转换为错误,所以现在你不得不处理它们。 【参考方案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

【讨论】:

以上是关于如何解决列表和文件的“C”中的“分段错误”错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ std 线程和列表分段错误(核心转储)

非常简单的分段错误错误c ++ [关闭]

只有某些输入的 C 中的分段错误

来自 for 循环的分段错误

loop-malloc.c 的向量中的分段错误:没有这样的文件或目录

如何解决分段错误单链表?