c언어 포인터 관련 질문입니다!!

조회수 595회

이미지

평소에 포인터를 저런식으로 건드렸을 때 에러가 나지 않았었는데 가끔 저렇게 에러가 나는 경우가 있습니다.

아무리 생각해도 오류 날 게 없는 거 같은데 매번그렇지는 않은데 꽤 가끔씩 저러니깐 뭔가 이유가 있는거 같은데 모르겠습니다. 아무리 생각해도요오오오ㅜ

혹시 제가 포인터에 대해 잘 모르는 부분이 있는지 아니면 어디서 실수가 있는지 지적해주시면 감사하겠습니다.

1 답변

  • L->header->next = L->trailer;
    

    여기에서 BAD_ACCESS 에러가 발생했습니다. address=0x8 을 접근하려고 하는데, 0x8 같은 절대주소는 접근해서는 안 되는 메모리 주소죠.

    위 코드 중에서 어떤 것이 0x8 인지를 생각해 봅니다.

    1. L->header :
    2. L->header->next :
    3. L->trailer :

    이 세가지 중에 하나가 0x8 이라는 주소를 가지고 있다는 말인데, L 은 &test 입니다. test 는 스택에 잡힌 변수이니까 &test (= L) 는 스택의 정당한 주소를 가지고 있을 겁니다.

    1번과 3번의 L->header 와 L->trailer 는 정당한 주소입니다. 스택의 어딘가를 가리키고 있을 겁니다.

    2번을 보면, L->header->next 인데, L->header 는 Node* 타입이고, 이건 포인터이고 어떤 메모리주소값이어야 합니다. 그런데, test 를 선언하면서, 그 안의 header, trailer노드에 대한 지정이 없습니다. 릴리즈, 디버거 모드 빌드일 때마다 다르긴 한데, test 는 내용이 0으로 채워져 초기화 되었다고 봅니다. 그래서, L->header 는 0 이라는 주소값을 갖게 됩니다. 즉 널포인터입니다. L->header 가 0이기 때문에, L->header->next 의 주소는 0 + Node의 next 멤버까지의 오프셋. 이 오프셋ㅇ 0x8 인 상황입니다.

    OK

    • 넵 감사합니다 대략적으로 보면 초기화를 해줄때 안에 있는 포인터들을 초기화 해주지 않아서 발생한 문제라는 뜻이지요?? 실제로 초기화 후에 진행해보니 잘 돌아가네요! 알 수 없는 사용자 2021.4.27 13:02

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

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

(ಠ_ಠ)
(ಠ‿ಠ)