c언어 포인터 관련 질문입니다!!
조회수 595회
평소에 포인터를 저런식으로 건드렸을 때 에러가 나지 않았었는데 가끔 저렇게 에러가 나는 경우가 있습니다.
아무리 생각해도 오류 날 게 없는 거 같은데 매번그렇지는 않은데 꽤 가끔씩 저러니깐 뭔가 이유가 있는거 같은데 모르겠습니다. 아무리 생각해도요오오오ㅜ
혹시 제가 포인터에 대해 잘 모르는 부분이 있는지 아니면 어디서 실수가 있는지 지적해주시면 감사하겠습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
L->header->next = L->trailer;
여기에서 BAD_ACCESS 에러가 발생했습니다. address=0x8 을 접근하려고 하는데, 0x8 같은 절대주소는 접근해서는 안 되는 메모리 주소죠.
위 코드 중에서 어떤 것이 0x8 인지를 생각해 봅니다.
- L->header :
- L->header->next :
- 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
댓글 입력