正在使用编译器,我想打印出一个符号表。我有一个节点结构,我需要访问全局变量“ 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的输出应该是零,因为它是代码的第一遍,但是我遇到了分段错误。
答案 0 :(得分:0)
这是不正确的:
printf(lineCount);
printf
的第一个参数是描述您要打印的内容的格式字符串。由于您要传递给函数的类型不是预期的类型,因此您调用undefined behavior会导致崩溃。
如果要打印整数,请使用%d
格式说明符。
printf("%d\n", lineCount);
答案 1 :(得分:0)
printf
将类型char*
的参数作为其第一个参数。您正在为它传递一个整数(如果您至少没有收到有关该整数的警告,则应提高编译器的警告级别;如果这样做,则应停止忽略警告)。将该整数转换为char*
不会得到有效字符串的地址(特别是因为它以0开始,因此您将获得一个空指针),因此将其传递给printf
取消引用后,将调用未定义的行为。在这种情况下,未定义的行为表现为细分错误。