본문 바로가기
3-2 학기/Operating Systems

[운영체제] Memory API

by bona.com 2024. 10. 14.

✅malloc()

#include <stdlib.h>

void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);

 

위의 함수들은 메모리 할당을 위해 사용되는 라이브러리 함수이다.

 

malloc()calloc()지정된 크기의 바이트 메모리를 할당받는다.

malloc()의 경우, 할당된 메모리의 초기 값은 정의되지 않고 

calloc()의 경우, 할당된 메모리를 모두 0으로 초기화한다.

 

또한 두 함수는 가용 리스트를 통해 첫 번째 블록에 접근한다.

포인터를 따라 이동하면서 정해진 알고리즘에 의해 리턴할 블록을 찾으며, 적절히 포인터를 조정하여 가용 메모리 리스트에서 이 블록을 가져와 그 블록을 사용자가 이용할 수 있도록 리턴한다.

 

realloc()은 이미 할당받은 메모리 공간 크기를 늘리거나 줄일 수 있도록 하는 함수이다.

 

✅일반적인 에러

1. 메모리 할당을 하지 않은 경우 (segmentation fault)

char *src = "hello";
char *dst;			
strcpy(dst, src);

 

위 예제에서는 메모리 접근 오류가 발생한다.

 

그 이유를 알아보면, src는 "hello"라는 문자열을 가리키는 포인터이다. "hello"는 문자열 상수로 메모리의 읽기 전용 영역에 저장된다.

dst도 문자열을 저장할 포인터인데, 초기화는 되지 않았다. 즉, dst는 아무 메모리 공간도 가리키고 있지 않기 때문에 유효하지 않은 메모리 주소를 가지고 있다.

 

그런데 strcpy()를 통해 src 문자열을 dst가 가리키는 위치로 복사를 하려고 한다.

이때 dst는 유효하지 않은 메모리 공간을 가리키고 있기 때문에 Segmentation Fault가 발생하는 것이다.

 

2. 충분히 메모리를 할당하지 않은 경우 (buffer overflow)

char *src = "hello";
char *dst = (char *) malloc(strlen(src));
strcpy(dst, src);