해결된 질문
작성
·
185
1
while(ret > 0) 루프 안쪽의
event = (struct inotify_event *)(char *)event + sizeof(struct inotify_event) + event->len; 을
event += sizeof(struct inotify_event) + event->len;으로 바꾸어서 실행해보니 실행결과는 동일한데 이렇게 써도 문제없는 건가요?
답변 2
1
안녕하세요. 강덕영님. 답변 드립니다.
결론부터 말씀드리자면, 질문 글과 같이 바꾸시면 안됩니다. 실행 결과가 동일한 것은.. 운이 좋아서 혹은 운이 나빠서 입니다 :( 차근히 설명 드릴게요.
event 변수는 struct inotify_event의 포인터 입니다. C 언어에서 포인터에 plus 연산을 하면 포인터의 주소값에 해당 자료구조(즉, 여기에서는 struct inotify_event) 크기의 배수만큼 증가합니다.
쉽게 예를 들자면, char *p; 로 선언된 포인터 p 에 p+=16;을 하면, '원래 주소값 + (1 * 16)'의 값이 포인터 p에 저장됩니다. char의 크기가 1바이트 이기 때문이죠. 만약 int *p로 선언된 포인터 p에 p+=16;을 하면 '원래 주소값 + (4 * 16)'의 값이 포인터 p에 저장됩니다. int의 크기가 4바이트이기 때문입니다.
원본 코드에 대한 부연 설명을 드릴게요. 질문 글에서 원본 코드 부분에 괄호가 빠졌습니다. 원본 코드는 아래와 같습니다.
event = (struct inotify_event *)((char *)event + sizeof(struct inotify_event) + event->len);
질문글에서 빠뜨리신 괄호는 중요한 의미를 갖습니다. 이 괄호는 event 변수를 char pointer로 casting하여 자료구조의 크기가 1바이트인 포인터로 만들고 나서 sizeof(struct inotify_event) + event->len 만큼을 더해주게 하는 역할을 합니다. 그리고나서 다시 struct inotify_event 포인터로 casting 해 event 포인터 변수에 저장하게 됩니다.
만약, 질문글에서 작성하신 코드를 반영하자면 아래와 같이 동작할 것 입니다. struct inotify_event의 사이즈는 16바이트이므로 'event 포인터 주소값 + 16*(16 + event->len)'을 event 변수에 저장합니다.
이해가 되셨는지 모르겠네요. 잘 이해가 되시지 않으신다면 관련 내용을 좀 더 찾아보시길 추천해 드립니다. C 언어를 다루면서 꼭 아셔야 할 내용인 것 같습니다. "C언어 포인터 덧셈" 정도의 키워드로 검색을 해보니 자세히 소개된 여러 페이지들이 검색되네요. 그럼 열공하세요!
0