나는 bison/yacc (그리고 약간의 c를 리뷰)을 배우고 json 파서를 간단한 테스트 프로젝트로 만들려고한다.Pointers, bison and yacc
http://www.json.org/에있는 용어를 사용하여 문자열/값 쌍을 나타내는 구조체 쌍과 기본적으로 쌍의 연결된 목록에 대한 포인터가 들어있는 멤버 필드가있는 개체를 나타내는 struct 개체가 있습니다.
새로운 쌍을 반환하는 간단한 c 함수 (create_pair)가 있습니다. 내가 설명 할 수없는 이상한 행동을 알아 냈다.
- "main"에서 이러한 함수를 호출하고 반환 된 구조체의 메모리 주소를 인쇄하면 해당 주소는 항상 다릅니다.
- 내가 "들소"액션에서 아주 똑같은 함수를 호출하면, 내 함수가 항상 같은 메모리 주소에 상주하는 포인터를 반환한다는 것을 알 수 있습니다.
이것은 의미가 있습니까?
정보/코드 따르
- http://pastebin.com/k272vVb5 : 여기 코드 (링크, 네 개의 다른 파일을 가리키는 4 개 페이스트 빈 링크 목록이 "프로젝트"에 포함 된 포함)입니다
당신은 컴파일하고 그것을 실행할 수 있습니다
lex t.l
yacc -d t.y
cc y.tab.c lex.yy.c t.c
./a.out
,536,913 코드를 실행하고 다음과 같은 입력으로 실행하면 63,210
:
{ "firstName을": "A", "이 lastName": "B" }
해당가 표시됩니다
를1) "주"(검사 파일 타이)에서 실행되는 코드는 그때 자신의 메모리 주소를 인쇄, 네 가지 쌍의 객체를 생성하고 출력 (통지 서로 다른 주소 같은)입니다 :
p 0x7fff52476be8 //(<-memory address for pair p)
print pair: P, Hellov
q 0x7fff52476bc8 //(<-memory address for pair q)
print pair: Q, Hellox
2) 위의 json 샘플을 붙여 넣자 마자 "pairName"에 대한 첫 번째로 "pair"규칙을 두 번 누르십시오. "A", 두 번째로 "lastName"규칙 : "B", 새 쌍을 만듭니다. 두 경우 모두 메모리 주소를 인쇄하면 동일합니다.
Creating pair 0x7fff52475c88
print pair: firstName, A
Creating pair 0x7fff52475c88
print pair: lastName, B
왜 이런 일이 발생합니까?
좋아,이 질문은 명확하고 정확한 대답 : 감사합니다! 그러나 이것에 대해 다시 생각해 봅시다 : "members"규칙이 히트 될 때 (멤버 : COMMA 쌍 구성원), $ 1과 $ 3의 값을 확인하는 것이 가능합니다 ($ 1은 멤버로부터 반환 된 값입니다 : 한 쌍). $ 1과 $ 3이 (가) 같은 쌍을 가리키고 있습니까? 희망이 분명하다. – user1417009
@ user1417009 : 프로덕션'pair : string COLON value'에서'$$ = & p;'를 지정합니다. 우리가 배웠 듯이,'& p'는 스택에있는 자동 객체의 주소입니다. 이 규칙에 대한 코드가 블록을 종료하면 (이 할당 직후) 객체 수명이 끝나고 스택이 다른 용도로 다시 사용됩니다. 따라서이 '쌍'과 관련된 주소는 유효하지 않습니다. 실행이'members'에 대한 규칙에 도달하면,이 주소를 사용하려고 시도합니다.이 주소는'members'에 대한 객체를 가리키고 있습니다. [계속 ...] –
자동 개체의 주소를'yylval' 개체에 보관해서는 안됩니다. 개체를 복사하거나 동적으로 할당 한 주소에 포인터를 사용해야합니다. –