typedef 结构中的分段错误
Segmentation Fault in typedef struct
我正在尝试使用 FLEX 和 C 制作一个 sintax 分析器,我实现了一个堆栈,它工作正常但是当试图访问结构的元素时它 returns 一个分段错误,我想它有一些东西处理结构体元素的定义。
这是parser.h文件
#include <stdbool.h>
#ifndef PARSER_H
#define PARSER_H
void error();
bool analisis();
int tokenActual;
#endif
这是一个 parser.c 文件
#include <stdio.h>
#include <stdlib.h>
#include "parser.h"
#include "pila.h"
#include "NuT.h"
#include "produccion.h"
extern int yylex();
typedef struct _symbol{
// Indica si es terminal o no terminal
short type;
// Representacion del simbolo en string
char *name;
// Indice del simbolo
short pos;
}sym;
// No terminales
sym *S_ = {NON_TERM,"S",0};
sym *SP_ = {NON_TERM,"SP",1};
//Terminales
sym *OR = {TERM,"v",2};
sym *PROD = {TERM,"*",3};
sym *SUM = {TERM,"+",4};
sym *INTERR = {TERM,"?",5};
sym *A = {TERM, "a", 6};
sym *B = {TERM,"b",7};
sym *PI = {TERM,"(",8};
sym *PD = {TERM, ")", 9};
sym *EPS = {EPSILON,"ε",10};
sym *EOFF = {TERM,"$",11};
这是NuT.h:
#include <stdio.h>
#ifndef NUT_H
#define NUT_H
#define TERM 1
#define NON_TERM 2
#define EPSILON 3
#endif
typedef struct _symbol sym;
pila.h 文件:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <assert.h>
#include "NuT.h"
typedef struct _nodo nodo;
typedef struct _Stack Stack;
/* Crea una nueva pila */
Stack* new_stack(void);
/* Permite introducir un elemento a una pila */
void push(Stack* pila, sym* elemento);
/* Permite sacar el primer elemento de la pila */
void* pop(Stack* pila);
/* Indica si una pila no contiene elementos */
bool is_empty(Stack* pila);
/* Permite liberar la memoria que utiliza la pila */
void free_stack(Stack* pila);
/*Permite ver el elemento al tope de la pila*/
sym *top(Stack* pila);
produccion.h 文件:
#include <stdio.h>
typedef struct _production prod;
有什么想法或意见吗?谢谢
问题是像 sym *OR = {TERM,"v",2};
这样的东西不是有效的 C,它只是胡言乱语。您不能使用结构初始化列表来初始化结构 pointer。它需要指向一个实际的对象。所以只需删除 *
指针声明,为什么需要这些作为指针?
这就是为什么初学者应该始终使用符合标准的 C 编译器进行编译的原因。我推荐使用
gcc -std=c11 -pedantic-errors -Wall -Wextra
这会为您指出错误(与接受大量无效代码的默认 gcc 不同)。解决编译时错误比解决 运行 时间段错误要容易得多。
我正在尝试使用 FLEX 和 C 制作一个 sintax 分析器,我实现了一个堆栈,它工作正常但是当试图访问结构的元素时它 returns 一个分段错误,我想它有一些东西处理结构体元素的定义。
这是parser.h文件
#include <stdbool.h>
#ifndef PARSER_H
#define PARSER_H
void error();
bool analisis();
int tokenActual;
#endif
这是一个 parser.c 文件
#include <stdio.h>
#include <stdlib.h>
#include "parser.h"
#include "pila.h"
#include "NuT.h"
#include "produccion.h"
extern int yylex();
typedef struct _symbol{
// Indica si es terminal o no terminal
short type;
// Representacion del simbolo en string
char *name;
// Indice del simbolo
short pos;
}sym;
// No terminales
sym *S_ = {NON_TERM,"S",0};
sym *SP_ = {NON_TERM,"SP",1};
//Terminales
sym *OR = {TERM,"v",2};
sym *PROD = {TERM,"*",3};
sym *SUM = {TERM,"+",4};
sym *INTERR = {TERM,"?",5};
sym *A = {TERM, "a", 6};
sym *B = {TERM,"b",7};
sym *PI = {TERM,"(",8};
sym *PD = {TERM, ")", 9};
sym *EPS = {EPSILON,"ε",10};
sym *EOFF = {TERM,"$",11};
这是NuT.h:
#include <stdio.h>
#ifndef NUT_H
#define NUT_H
#define TERM 1
#define NON_TERM 2
#define EPSILON 3
#endif
typedef struct _symbol sym;
pila.h 文件:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <assert.h>
#include "NuT.h"
typedef struct _nodo nodo;
typedef struct _Stack Stack;
/* Crea una nueva pila */
Stack* new_stack(void);
/* Permite introducir un elemento a una pila */
void push(Stack* pila, sym* elemento);
/* Permite sacar el primer elemento de la pila */
void* pop(Stack* pila);
/* Indica si una pila no contiene elementos */
bool is_empty(Stack* pila);
/* Permite liberar la memoria que utiliza la pila */
void free_stack(Stack* pila);
/*Permite ver el elemento al tope de la pila*/
sym *top(Stack* pila);
produccion.h 文件:
#include <stdio.h>
typedef struct _production prod;
有什么想法或意见吗?谢谢
问题是像 sym *OR = {TERM,"v",2};
这样的东西不是有效的 C,它只是胡言乱语。您不能使用结构初始化列表来初始化结构 pointer。它需要指向一个实际的对象。所以只需删除 *
指针声明,为什么需要这些作为指针?
这就是为什么初学者应该始终使用符合标准的 C 编译器进行编译的原因。我推荐使用
gcc -std=c11 -pedantic-errors -Wall -Wextra
这会为您指出错误(与接受大量无效代码的默认 gcc 不同)。解决编译时错误比解决 运行 时间段错误要容易得多。