(void *)-1 [ 크래프톤 정글 51일차 ]

jinsung·2025년 7월 2일

크래프톤 정글 9기

목록 보기
46/59

✅ [ WEEK07 ] 탐험준비 - malloc-lab


WEEK 진행률

🎯 1. 키워드 공부

  • ☑️ 가상 메모리, 페이징
  • ☑️ 동적 메모리 할당 (힙, sbrk, malloc, free)
  • ☑️ 메모리 단편화
  • ☑️ 메모리 할당 정책 (first fit, next fit, best fit)
  • ☑️ implicit free list / explicit free list
  • ☑️ demand-zero memory
  • ☑️ 시스템 콜
  • ☑️ DMA
  • ☑️ 이더넷

🎯 2. 테스트 케이스

  • ☑️ short1-bal.rep : valid yes
  • ☑️ short2-bal.rep : valid yes
  • ☑️ amptjp-bal.rep : valid yes
  • ☑️ cccp-bal.rep : valid yes
  • ☑️ cp-decl-bal.rep : valid yes
  • ☑️ expr-bal.rep : valid yes
  • ☑️ coalescing-bal.rep : valid yes
  • ☑️ random-bal.rep : valid yes
  • ☑️ random2-bal.rep : valid yes
  • ☑️ binary-bal.rep : valid yes
  • ☑️ binary2-bal.rep : valid yes
  • ☑️ realloc-bal.rep : valid yes
  • ☑️ realloc2-bal.rep : valid yes
  • ☑️ perf index ?
  • ☑️ perf index 83
    util 40
    thru 43

🎯 3. 책 읽기

  • ☑️ CS APP : 8장 예외적인 제어 흐름
  • ☑️ CS APP : 9장 가상 메모리

진행률 : 50% ( 진행은 다했는데 이해 다 못함 )

(void *)-1

memlib.c 파일을 파악하다가 이런 코드 보신적 있으신가요?

엥?? 보통 에러 날 때는 return NULL을 해주는데
이 코드에서는 return (void *)-1을 해주고 있어요.

이게 뭘까요?

(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이 아닌 (void *)-1 ?

NULL은 0번주소인데 아무것도 가리키지 않는다! 는 뜻이지만,실패를 나타내기엔 모호해요.

그래서 의도적으로 절대 유효하지 않은 주소인 -1을 포인터로 변환해서 리턴합니다.

마무리

다들 이번주도 고생 많으셨습니다.
감사합니다.

1개의 댓글

comment-user-thumbnail
2025년 7월 3일

이번 주도 고생 많았습니다

답글 달기