C语言 全局变量未在词法分析器函数中读取



在编译器上工作,我想打印出一个符号表。我有一个节点结构,我需要访问全局变量"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] = '';
        strncpy(new_node->type, typel, STRINGMAX);
        printf("allocated new node spacen");

        printf(lineCount);
        nodes[lineCount] = new_node;
        if(lineCount > 0){
            cleanNodes(nodes);
      }
        getData(new_node);
    }

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

这是

不正确的:

printf(lineCount);

printf的第一个参数是描述要打印的内容的格式字符串。 由于传递给函数的类型不是它所期望的,因此调用未定义的行为,在这种情况下会导致崩溃。

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

printf("%dn", lineCount);

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

最新更新