C 调用mknode函数时出现分段故障(堆芯转储)错误 定义YYSTYPE结构节点1*
%令牌INT浮点字符双空 start:Declaration函数Declaration1{$=mknode($1,$2,$3,NULL,0);} 类型:INT{$$=mknode(NULL,NULL,NULL,NULL,NULL,“INT”);} |FLOAT{$$=mknode(NULL,NULL,NULL,NULL,“FLOAT”);} |CHAR{$$=mknode(NULL,NULL,NULL,NULL,“CHAR”);} |DOUBLE{$$=mknode(NULL,NULL,NULL,NULL,“DOUBLE”);} |VOID{$$=mknode(NULL,NULL,NULL,NULL,NULL,“VOID”);} )C 调用mknode函数时出现分段故障(堆芯转储)错误 定义YYSTYPE结构节点1*,c,yacc,C,Yacc,%令牌INT浮点字符双空 start:Declaration函数Declaration1{$=mknode($1,$2,$3,NULL,0);} 类型:INT{$$=mknode(NULL,NULL,NULL,NULL,NULL,“INT”);} |FLOAT{$$=mknode(NULL,NULL,NULL,NULL,“FLOAT”);} |CHAR{$$=mknode(NULL,NULL,NULL,NULL,“CHAR”);} |DOUBLE{$$=mknode(NULL,NULL,NULL
这里的错误是什么?plz help虽然您确实应该在调试器中运行程序以找到它,但这两行代码可能是罪魁祸首:
char *newstr = (char *)malloc(strlen(token));
strcpy(newstr, token);
如果token
为NULL
,则strlen
和strcpy
极有可能崩溃
取消引用
NULL
指针是未定义的行为,在大多数情况下会导致崩溃。在取消引用指针或调用函数之前,需要检查指针是否为空。我已将o替换为空,但仍然不是空working@swati... 你从代币中得到了什么???请编辑标记值。@Krishna在删除分段错误后,我已为标记添加了上述规则,现在显示在我尝试运行程序时解析失败。.但在此之前没有解析错误。.我在编写操作之前解析了整个程序,它已成功解析。.但现在不是。.什么可能是错误~$yacc c.y~$lex c.l~$gcc y.tab.c-ll-ly~$./a.out int main(){}3:语法错误解析失败我正在传递NULL来代替令牌,因为我没有该规则的令牌值..我还应该传递什么来代替令牌呢NULL@swati将NULL
传递给函数是可以的,在使用字符串之前,您只需检查它。感谢@joachim segmentation fault已为此删除…我在创建newstrBtw之前检查了令牌值。如果token
不为空,则仍有strlen()+1
待处理allocated@IngoLeonhardt是的,我已经写了strlen()+1这也..但仍然解析失败..这甚至不是解析int main(){}
CompoundStmt: '{' StmtList '}' {$$ =$2; }
;
StmtList: StmtList Stmt {$$ = mknode($1,$2,NULL,NULL,NULL); }
| {$$=mknode(NULL,NULL,NULL,NULL,NULL);}
;
when i am running this on the input
int mian()
{}
it is giving segementation fault at
char* newnode =(char*)malloc(strlen(token));
node1 *mknode(node1 *left1, node1 *left2, node1* left3,node1* left4,char *token)
{
/* malloc the node */
node1 *newnode = (node1 *)malloc(sizeof(node1));
char *newstr = (char *)malloc(strlen(token));
strcpy(newstr, token);
newnode->left1 = left1;
newnode->left2 = left2;
newnode->left3 = left3;
newnode->left4 = left4;
newnode->token = newstr;
return(newnode);
}
char *newstr = (char *)malloc(strlen(token));
strcpy(newstr, token);