여기 내 어휘 분석기에 대한 코드의 도우미 함수로 사용 작은 람다 함수의는 strtod 사용 후 발생 Token
하는 속성을 가진 클래스입니다 value
유형이 void
이고, line
유형이 int
이고, type
이 사용자 지정 enum token_type
입니다. 첫 번째 줄에서는 새 값을 생성자에 전달하여 값에 대한 null 포인터 (여전히 생성해야하므로), 열거 형 값 token_type
(이 토큰이 해당 유형이므로 number
) 및 현재 행 우리는 람다에서 체포했습니다.이상한 일들이 표준 :
i
은 const char*
유형의 포인터로, 현재 검사중인 문자를 가리 킵니다. 이 람다 함수를 호출하면 프린터 할 수있는 문자를 가리킬 것입니다.
printf
은 디버깅 용도로 사용됩니다.
그래서 내가하려는 것은 다음과 같습니다. Token
number
; 현재 위치에서 번호를 만들 수 있다면 strtod
에게 문의하십시오. strtod
이 0이 아닌 값을 반환했는지 확인하십시오.이 경우 값을 새 Token
에 저장하고, 우리가 가리키는 문자의 위치를 숫자 바로 뒤의 문자로 옮기고 Token
을 반환합니다.
strtod
이 대신 0 값을 반환 한 경우 실제 0을 찾았거나 대신 숫자를 작성할 수 없으므로 0을 나타내는 경우 다시 검사해야합니다. 그래서 숫자 이후의 포인터가 현재 위치와 같은 문자를 가리키는 지 확인합니다. 사실이라면 strtok
은 그 포인터를 앞으로 나아 가지 않았기 때문에 숫자가 전혀 발견되지 않았 음을 의미합니다. 할당 된 값을 반환하고 null 포인터를 보내 신호). 그렇지 않으면 0이 발견되어 저장하고 사전에 저장하고 반환합니다.
문제는 말 그대로 segfault의 오류가있다 내가 after_number
을 복종하려고 모든 시간 : 즉, 내가 buildnumber
를 호출하는 경우가 "Advancing position"
를 인쇄 한 후 "111"
같은 문자열에 i
점, 나는 세그먼트 폴트를 얻을 때. 그리고 i
이 "+0.0"
또는 "abc()"
과 같은 문자열을 가리킬 때 전화하면 "Value was 0, comparing position to after number"
을 인쇄 한 후 segfault가 표시됩니다.
왜 그렇습니까? after_number
이 가리키는 포인터는 어떻게됩니까? 내가 도대체 뭘 잘못하고있는 겁니까?
'i == * after_number'는 정의되지 않은 동작을 발생시킵니다. null 포인터를 dereferncing –
이것은 작지 않다. –
@nm 글쎄, 만약 당신이'printf' 라인을 꺼내면 너무 길지 않다. 그리고 "If it's를"0으로 비교 "한 후에 압축 할 수도있다. 하나는'&&'를 사용했습니다. – user6245072