无法在Lexer函数中读取全局变量

时间:2019-04-02 19:12:39

标签: c flex-lexer

正在使用编译器,我想打印出一个符号表。我有一个节点结构,我需要访问全局变量“ lineCount”。当我尝试在idPush函数中打印它时,出现分段错误。我的目标是将节点放置在数组中或链接在一起,然后打印表。

我尝试将其打印在代码中的其他位置,但是出现了错误。我运行了一个包含的文本文件,该文件很短,只是为了确保它可以正常工作。

%option noyywrap
%{

    #include <stdio.h>  /* needed for printf() */
    #define YY_DECL int yylex()
    #define STRINGMAX 25
    struct Node* nodes[100];
        int lineCount = 0;


    struct Node
    {
        int data;
        char type[STRINGMAX];
        char wordv[STRINGMAX];

        struct Node *next;
    };
        void idPush(const char *new_data, char *typel){
        // Allocate memory for node 
        struct Node* new_node = malloc(sizeof(struct Node)); 
        strncpy(new_node->wordv, new_data, STRINGMAX-1); 
        new_node->wordv[STRINGMAX-1] = '\0';
        strncpy(new_node->type, typel, STRINGMAX);

        printf("allocated new node space\n");


        printf(lineCount);
        nodes[lineCount] = new_node;

        if(lineCount > 0){
            cleanNodes(nodes);
      }
        getData(new_node);

    }

lineCount的输出应该是零,因为它是代码的第一遍,但是我遇到了分段错误。

2 个答案:

答案 0 :(得分:0)

这是不正确的:

printf(lineCount);

printf的第一个参数是描述您要打印的内容的格式字符串。由于您要传递给函数的类型不是预期的类型,因此您调用undefined behavior会导致崩溃。

如果要打印整数,请使用%d格式说明符。

printf("%d\n", lineCount);

答案 1 :(得分:0)

printf将类型char*的参数作为其第一个参数。您正在为它传递一个整数(如果您至少没有收到有关该整数的警告,则应提高编译器的警告级别;如果这样做,则应停止忽略警告)。将该整数转换为char*不会得到有效字符串的地址(特别是因为它以0开始,因此您将获得一个空指针),因此将其传递给printf取消引用后,将调用未定义的行为。在这种情况下,未定义的行为表现为细分错误。