본문 바로가기
SW사관학교 정글 4기

[C, rbtree] 구조체 속 구조체 포인터

by g0n1 2022. 5. 2.
728x90

문제 상황

rbtree 헤더파일

위는 제공받은 헤더 파일이다. node와 rbtree 구조체가 선언되어 있는 모습이다.

 

내가 처음에 작성했던 코드

이 코드의 9,10번 라인이 내가 작성한 코드이다. 이 코드를 make test로 실행시켜 보면 segment fault가 발생했다.

원인

segment fault는 참조할 수 없는 값을 참조하는 경우에 발생한다고 한다.

나는 5번 라인에서 rbtree크기만큼의 calloc를 수행하면 노드 2개(root, nil)가 들어갈만큼의 메모리를 할당받는 줄 알았고, 그 두 노드가 생성되는 줄 알았다.

해결

6번 라인을 통해 p에서 접근할(가질) 수 있는 것은 root와 nil 인데, 이는 각각 다른 노드의 주소를 저장할 수 있는 포인터라, parent나 color같은 속성이 없었다. 따라서 노드 크기의 메모리를 할당받은 다음 nil과 root에 생성한 노드의 주소를 저장해줘야 하는 것이다.

수정한 코드, 잘 돌아간다.

알게 된 것

  • 포인터는 어떤 데이터 타입의 포인터든 고정된 길이를 갖는다.
  • *p를 타고 가면 rbtree만큼의 메모리가 있다. 그러나 p 자체는 고정된 길이이기 때문에 포인터 변수 앞에 선언되는 타입을 떼고 보면 좀 더 쉽게 느껴진다.
728x90

댓글