2013-08-13 6 views
0

정의한 mknode 함수를 호출하면서 YYSTYPE 구조체 노드 1 *

퍼센트 토큰 INT 플로트 CHAR DOUBLE VOID세그먼트 오류 (코어 덤프) 오류

시작 : 선언 기능 Declaration1 {$$ = 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"); }

| DOUBLE {$$ = 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); 

token 경우 다음 NULL 모두 strlenstrcpy 거의 확실 충돌입니다 : 당신이 정말로 그것을 찾기 위해 디버거에서 프로그램을 실행해야하지만 PLZ

+0

나는 여전히 작동하지 않는 NULL로 o를 대체했습니다. – user123

+0

@swati ... 토큰에 무엇을 넣고 있습니까 ??? 토큰 값을 편집하십시오. – someone

+0

@Krishna 분할 토폴로지를 제거한 후 – user123

답변

0

도움이 두 줄은 가능성이 범인입니다.

NULL 포인터를 역 참조하면 정의되지 않은 동작이 발생하며 대부분의 경우 충돌이 발생합니다. 포인터를 역 참조하기 전에, 또는 함수를 호출하기 전에 포인터가 NULL인지 확인해야합니다.

+0

실패 오류 구문 NULL – user123

+0

@swati 함수에'NULL'을 건네도 괜찮습니다. 문자열을 사용하기 전에 확인하십시오. –

+0

감사합니다. @joachim 세분화 오류가 지금 제거되었습니다. ... newstr을 생성하기 전에 토큰 값을 확인했습니다. – user123

관련 문제