c++ vector에 포인터를 삽입하니 정상적인 값이 입력 되지 않습니다.

조회수 1354회

이미지

이런식으로 트리 구조를 만드려고 합니다. 입력은 (D B), (G B) , (K,G), (J,A) 이런 식으로 알파벳이 2개씩 주어집니다. 오른쪽이 왼쪽 알파벳의 상위 노드 입니다.

코드 구현은 '노드이름-상위 노드' 로 class가 구성된 vector를 사용하였습니다.

#include <iostream>
#include <vector>

using namespace std;

class node {
private:
    friend class node;
    char num;
    node*  pnum = NULL; // 상위 node를 가르키는  포인터
public:
    node(char num, node& p) : num(num), pnum(&p) {}
    node(char num) : num(num){}
};

int main(void) {
    vector<node> tree;

    while (true) {
        char n1, n2;
        cin >> n1 >> n2;
        tree.emplace_back(n1);
        tree.emplace_back(n2, tree.back());
                /*
                emplace_back대신 아래 코드를 사용해도 같은결과입니다.
                node a(n1);
                tree.push_back(a);
                node b(n2, tree.back());
                tree.push_back(b);
                */
    }
    return 0;
}

처음에 cin으로 D(n1) 와 B(n2)가 주어지면 node : B-(pointer pnum =NULL)을 만들고 vector인 tree에 넣습니다. 그 뒤 node : D-(point pnum = &B) 을 만들고 vector인 tree에 넣는 식입니다. 하지만 vector tree에 저장된 D을 거쳐 상위노드 B로 가면 저장된 값 num이 쓰레기값으로 나오는데 원인을 모르겠습니다.

처음에 tree.emplace_back(n1)을 실행하면서 생성자가 호출된 상황입니다. this포인터를 보면 현재 Ox00ececa0에 node가 생성된 것을 확인 할 수 있습니다. 이미지

vector인 tree의 첫부분이 0x00ececa0을 가르키는것을 보면 정상적으로 저장된 상황입니다. 이미지

그러나 이후 vector에 num이 B이고 pnum(상위노드)에 tree0의 주소값을 저장하는 순간 0x00ececa0에서 0x00ecb3b8로 tree의 시작 주소가 변해 버렸습니다. 즉 pnum이 엉뚱한 주소를 가르키는 바람에 쓰레기값이 저장되는 상황이 벌어집니다. 이미지

즉 pnum이 바뀐 주소값에 따라 다시 가르키는 상황이 되어야하는데 해결 방법을 모르겠습니다...

  • 포인터를 잘 모르는 것 같은데요....트리보다 단순한 링크드리스트부터 작성해보세요. 정영훈 2018.11.16 22:43

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)