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 不同)。解决编译时错误比解决 运行 时间段错误要容易得多。