🎯 1. 키워드 공부
🎯 2. 테스트 케이스
🎯 3. 책 읽기
진행률 : 50% ( 진행은 다했는데 이해 다 못함 )
memlib.c 파일을 파악하다가 이런 코드 보신적 있으신가요?

엥?? 보통 에러 날 때는 return NULL을 해주는데
이 코드에서는 return (void *)-1을 해주고 있어요.
이게 뭘까요?
두개를 떼어서 놓고 봐볼게요.
(void *)
-1 // 0xffffffffff
-1 은 정수형 리터럴인데요.
2진법으로는 0b111111111... 일거예요. 2의 보수 표현법으로요!
16진법으로는 0xffffffffffff... 겠죠?
(void *) 은 형변환이예요. 즉 -1을 void 포인터로 변환하겠단 뜻이예요.
결과적으로 (void *)-1 은
주소 -1을 가리키는 포인터가 됩니다.
하지만 실제로 주소 -1은 유효한 메모리 주소가 아니고, 절대 접근하면 안되는 값이예요.

왜냐하면 0xffffffffffff 는 유저가 접근하면 안되는 커널이니까요!
void *addr = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == (void *)-1) {
// mmap 실패
perror("mmap");
}
mmap 함수는 실패시 (void *)-1 을 반환해요.
-1은 유효한 주소가 될 수 없기 때문에, 오류 구분용으로 많이 사용한다고 합니다.
NULL은 0번주소인데 아무것도 가리키지 않는다! 는 뜻이지만,실패를 나타내기엔 모호해요.
그래서 의도적으로 절대 유효하지 않은 주소인 -1을 포인터로 변환해서 리턴합니다.
마무리
다들 이번주도 고생 많으셨습니다.
감사합니다.
이번 주도 고생 많았습니다