• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

(char *) event로 하는 이유

21.07.04 00:33 작성 조회수 141

1

envent 값을 업데이트 하는 과정에서 

왜 (char *) event로 해주어야 하나요??

그냥 event = (struct inotify_event *)(event + sizeof(strcut inotify_event) + event->len);

으로 해주어도 결과가 똑같은데 (char *)의 의미를 잘 모르겠습니다

답변 1

답변을 작성해보세요.

2

안녕하세요. Jae Ung Yoon 님.

결론부터 말씀드리자면, (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 언어에서 자주 사용되고, 또 자주 버그를 만들어내는 부분입니다. 반드시 숙지하셔서 실수 없으시길 바라겠습니다.

더 궁금한 사항 있으시면 추가 질문 남겨주세요~