C 调用mknode函数时出现分段故障(堆芯转储)错误 定义YYSTYPE结构节点1*

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

%令牌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”);}

)


这里的错误是什么?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);