在编译器上工作,我想打印出一个符号表。我有一个节点结构,我需要访问全局变量"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
将调用未定义的行为。在这种情况下,未定义的行为表现为分段错误。