• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    해결됨

select.c 관련 질문입니다

20.08.15 13:12 작성 조회수 102

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

강덕영님의 프로필

강덕영

질문자

2020.08.16

자료형에 대해 너무 안일하게 생각하고 연산을 한 것 같네요. 감사합니다! 이해가 됐습니다.