Memory API

rokky·2023년 10월 16일
0

운영 체제

목록 보기
9/10

Memory API : malloc()

#include <stdlib.h>

void* malloc(size_t size)
  • 힙에서 동적으로 할당된 메모리 영역
    • 인수
      • size_t size : 메모리 블락의 사이즈(byte단위)
      • size_t 는 unsigned int 형이다.(typedef unsigned size_t)
    • return 값
      • 성공 : malloc에 의해 할당된 메모리 블락으로의 void type의 포인터
      • Fail : Null 포인터

sizeof()

  • 루틴이나 메크로는 직접 숫자를 입력하기 보다는 malloc 안에 sizeof() 함수를 이용한다.

  • sizeof 이용 시 두가지 종류의 결과

    • 실제 "x"의 크기가 런타임에서 알아질 때

       int *x = malloc(10 * sizeof(int));
       printf("%d\n", sizeof(x)); // 결과 : 4(포인터의 크기)
    • 실제 "x"의 크기가 컴파일타임에서 알아질 때

       int x[10];
       printf("%d\n", sizeof(x)); // 결과 : 40(포인터가 가리키는 메모리의 크기)

      -> sizeof는 함수가 아닌 연산자 이기 때문에 sizeof x는 컴파일 시간에 결정
      컴파일 당시에는 malloc의 메모리 공간이 잡히지 않으므로 x의 크기인 4byte가 찍혀 나가게 된다.

free()

#include<stdlib.h>
void free(void* ptr)
  • malloc 요청에 의해 할당된 메모리 영역을 비워준다.
    • 인수
      • void *ptr : malloc으로 할당된 메모리 블록의 주소를 가진 포인터
    • return
      • None

메모리 할당

메모리 free

메모리 할당을 까먹을 경우

  • 틀린 코드
char *src = "hello";
char *dst;
strcpy(dst, src);

  • 맞은 코드
char *src = "hello";
char *dst = (char *)malloc(strlen(src) + 1); // +1은 /0 null 자리
strcpy(dst, src);

충분한 메모리를 할당하지 않은경우

  • 틀린 코드 but 정상적으로 작동함
char *src = "hello";
char *dst = (char *)malloc(strlen(src)); // +1은 /0 null 자리
strcpy(dst, src);
  • 해당 코드에서 dst 포인터는 5칸 할당되어 \n을 놓을 자리가 없다.
  • 그럼 왜 정상적으로 작동하냐?
    -> 허가된 기존 데이터가 들어있는 자리에 널 문자가 들어간다.(잘못된 데이터 삭제)

초기화를 까먹은 경우

  • 초기화되지 않은 값을 마주했을 때
int *x = (int *)malloc(sizeof(int));
printf("*x = %d\n", *x)

  • 해결 방법 : memset(x, 0, sizeof(int))함수로 0으로 초기화 한다.

메모리 누수

  • 프로그램이 메모리 할당량이 끝나 마침내 죽는것

dangling pointer

  • 메모리 이용이 끝나가 전에 freeing하는 것
    • 프로그램은 유효하지 않은 포인터로 메모리에 접근한다.

다른 메모리 API : calloc()

#include <stdlib.h>
void *calloc(size_t num, size_t size)
  • 메모리를 힙에 할당하고 반환하기 전에 0으로 만들어준다.
    • 인수
      • size_t num : 할당된 블럭의 수
      • size_t size : 각 블럭의 크기 (바이트)
    • return
      • 성공 : calloc에 의해 할당된 메모리를 향한 void 형의 포인터
      • 실패 : 널 포인터

ex) malloc(10 X sizeof(int)); -> calloc(10, sizeof(int))

double free

  • 이미 free된 메모리를 free할때
int *x = (int *)malloc(sizeof(int));
free(x);
free(x);
  • free 할 할당된 x의 메모리 공간이 존재하지 않아 -> undefined error 발생한다.

System Call

#include<unistd.h>

int brk(void* addr)
void *sbrk(intptr_t increment);
  • malloc 라이브러리는 brk system call이라 불린다.
    • brk는 프로그램의 break를 늘린다고 불린다.
      • break : address space에서 힙의 끝부분의 위치
      • sbrk는 brk와 유사한 추가적인 call이다.
    • 프로그래머는 brk나 sbrk와 같은 것을 직접 호출해서는 안된다.

0개의 댓글