해결된 질문
작성
·
178
0
답변 1
0
안녕하세요. 윤영진님
예전에 다른 수강생 분께서도 동일한 질문을 하셨었는데요, 그 때 달았던 답변 그대로 달겠습니다.
----
결론부터 말씀드리자면, (char *)를 붙인 코드와 붙이지 않은 코드는 완전히 다르게 동작합니다.
C언어의 포인터에 + 1과 같은 산술 연산을 하게되면 그 포인터의 자료형의 크기만큼 더하게 됩니다. event 포인터는 inotify_event 구조체의 포인터이기 때문에 "event + 10"을 하게 되면 event 포인터가 가리키는 "주소값 + (10 * sizeof(struct inotify_event))"가 됩니다.
위 코드의 목적은 event 포인터가 가리키는 주소값에 inotify_event 구조체의 크기와 event->len 값을 더한 만큼 포인터를 옮겨주려는 것입니다. 그래서 inotify_event 구조체를 char 포인터로 캐스팅 한 후 산술 연산을 하게 되는 것입니다. char는 size가 1이기 때문에 포인터의 산술 연산이지만 더한 값만큼 주소가 옮겨지게 되겠죠 :)
char 포인터로 캐스팅하는 코드를 제거해도 제거하기 전과 동일하게 동작하는 것은 단순히 운이 좋아서(?) 입니다 :) 이벤트가 한 번에 여러 개가 올라왔다면 while() 내에서 event 포인터를 옮겨가며 처리하게 될텐데, 이게 한 번에 하나의 이벤트가 올라온 경우라면 엉뚱한 곳을 가리키는 event 포인터를 사용할 일이 없어서 아마 제대로 동작했을 수 있습니다.
이해가 되셨을지 모르겠네요. 포인터의 연산은 C 언어에서 자주 사용되고, 또 자주 버그를 만들어내는 부분입니다. 반드시 숙지하셔서 실수 없으시길 바라겠습니다.
더 궁금한 사항 있으시면 추가 질문 남겨주세요~
----
그리고 위 코드에 버그가 있습니다. while 문의 가장 아래 두 줄의 위치가 바뀌어야 합니다.
event = (struct inotify_event *)((char *)event + sizeof(struct inotify_event) + event->len);
ret -= (sizeof(struct inotify_event) + event->len);
요런 순서가 되어야 정상동작하게 됩니다. 첫 줄에서 event 포인터의 주소를 옮겨주고, 두번째 줄에서 ret 값에서 event 포인터를 이동한 만큼 빼주어야 정상동작합니다. 라이브 프로그래밍 진행 시 미스가 있었습니다.ㅠ 이 부분도 같이 확인해주세요!
감사합니다!
네 강사님 친절한 답변 감사드립니다. :)