如何解决列表和文件的“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”中的“分段错误”错误的主要内容,如果未能解决你的问题,请参考以下文章