c - 段错误(核心转储)调用 mknode 函数时出错

标签 c yacc

定义YYSTYPE结构节点1 *

%token INT FLOAT CHAR DOUBLE VOID

开始:声明函数声明1 {$$ = mknode($1, $2, $3,NULL,0);}

|Declaration Function             {$$=mknode($1,$2,NULL,NULL,0);}   
        
| Declaration                 {$$ =mknode($1,NULL,NULL,NULL,0); }

| Function                {$$ =mknode($1,NULL,NULL,NULL,0); }
;

Declaration1 :Function           {$$ =mknode($1,NULL,NULL,NULL,NULL); }
;


Function: 

Type ID '(' ArgListOpt ')' CompoundStmt         {$$ = mknode($1,$2,$4,$6,NULL); }
;

类型:INT {$$ = mknode(NULL,NULL,NULL,NULL,"INT"); }

| FLOAT {$$ = mknode(NULL,NULL,NULL,NULL,"FLOAT"); }

| CHAR {$$ = mknode(NULL,NULL,NULL,NULL,"CHAR"); }

|双 {$$ = mknode(NULL,NULL,NULL,NULL,"DOUBLE"); }

| VOID {$$ = mknode(NULL,NULL,NULL,NULL,"VOID"); }

;

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);

如果tokenNULL,那么strlenstrcpy很可能会崩溃。

取消引用 NULL 指针是未定义的行为,并且在大多数情况下会导致崩溃。在取消引用指针或调用执行此操作的函数之前,您需要检查指针是否为 NULL。

关于c - 段错误(核心转储)调用 mknode 函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18204401/

相关文章:

c - gethostbyname() 段错误

bison - 轮类减少冲突

postgresql - yacc函数中的@符号是什么意思

c - Flex Bison 不读取完整输入

c - 我无法在 Dev c++ 中编译简单的 C 函数程序?

c - C中的DFT函数实现

c - 使用 pthread_sigmask() 保护 sem_wait() 不受信号影响

c - 为什么可以在不检查返回值的情况下调用返回值的函数?

c - 语法中的左递归会导致冲突

c - Lex 正则表达式获得了一些额外的字符