Глобальная переменная не читается в функции Lexer - PullRequest
0 голосов
/ 02 апреля 2019

Работаю над компилятором, и я хочу распечатать таблицу символов.У меня есть структура узлов, и мне нужно получить доступ к глобальной переменной "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 голосов
/ 02 апреля 2019

printf принимает аргумент типа char* в качестве первого аргумента.Вы передаете ему целое число (и если вы не получили хотя бы предупреждения об этом, вам следует увеличить уровень предупреждений вашего компилятора - и если вы это сделали, вам следует прекратить игнорировать предупреждения).Преобразование этого целого числа в char* не приведет к адресу правильной строки (особенно потому, что он начинается с 0, так что вы получите нулевой указатель), поэтому его передают в printf, что разыменовывает его, вызовет неопределенное поведение.В этом случае неопределенное поведение проявляется как ошибка сегментации.

0 голосов
/ 02 апреля 2019

Это не правильно:

printf(lineCount);

Первый аргумент printf - это строка формата, которая описывает, что вы хотите напечатать.Поскольку тип, который вы передаете функции, не соответствует ожидаемому, вы вызываете неопределенное поведение , которое в этом случае приводит к сбою.

Если вы хотите напечатать целое число, используйтеспецификатор формата %d.

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