728x90
malloc, calloc, realloc은 C언어에서 동적 메모리 할당을 위해 사용되는 함수다.
- malloc (Memory Allocation)
- void* malloc(size_t size) 형태다.
- 지정된 크기의 메모리 블록을 할당하고, 할당된 메모리의 주소를 반환한다. 초기화하지 않으므로 메모리 내용은 예측할 수 없다.
- 예: int* arr = (int*)malloc(10 * sizeof(int)); // int형 10개를 저장할 수 있는 공간 할당
- calloc (Contiguous Allocation)
- void* calloc(size_t num, size_t size) 형태다.
- 지정된 수(num)의 요소 각각이 size 크기인 메모리 블록을 할당하고, 모든 바이트를 0으로 초기화한다.
- 예: int* arr = (int*)calloc(10, sizeof(int)); // int형 10개를 저장할 수 있는 공간을 할당하고 0으로 초기화
- realloc (Re-Allocation)
- void* realloc(void* ptr, size_t newSize) 형태다.
- 이미 할당된 메모리 블록의 크기를 newSize로 변경한다. 필요하면 새로운 위치로 메모리 블록을 이동시키고, 원래 위치의 메모리는 해제한다.
- 예: arr = (int*)realloc(arr, 20 * sizeof(int)); // arr의 크기를 int형 20개를 저장할 수 있도록 조정
이 함수들은 stdlib.h 헤더 파일에 정의되어 있으멀로 사용하기 위해서는 이 헤더 파일을 포함시켜야 한다. 동적 메모리 할당 후에는 free 함수를 사용하여 할당된 메모리를 해제해야 메모리 누수를 방지할 수 있다.
malloc | 지정된 크기의 메모리 블록을 할당. 초기화되지 않음. | int *a = malloc(4*sizeof(int)); | [ ?, ?, ?, ? ] |
calloc | 지정된 수의 요소에 대해 메모리를 할당하고 0으로 초기화. | int *b = calloc(4, sizeof(int)); | [ 0, 0, 0, 0 ] |
realloc | 기존에 할당된 메모리의 크기를 조정. 새 크기가 더 클 경우 초기화되지 않은 공간 추가됨. | a = realloc(a, 8*sizeof(int)); | [ ?, ?, ?, ?, ?, ?, ?, ? ] |
- malloc은 할당된 메모리의 초기 내용이 무엇인지 정의하지 않으므로, 메모리 내용은 예측할 수 없는 값(?)으로 표시됨.
- calloc은 할당된 메모리를 모두 0으로 초기화하기 때문에, 모든 요소가 0으로 표시됨.
- realloc을 사용하여 메모리 크기를 늘릴 경우, 추가된 메모리 영역은 초기화되지 않아 예측할 수 없는 값(?)으로 표시됨.
메모리 블록에는 다양한 데이터가 담길 수 있다. 어떤 데이터가 담기는지는 메모리 블록을 사용하는 프로그램의 목적과 구현에 따라 달라진다. 일반적으로 메모리 블록에는 다음과 같은 것들이 저장될 수 있다:
프로그램에서 사용하는 변수의 실제 데이터가 메모리에 저장된다. 이는 기본 자료형(int, float, char 등)의 값일 수도 있고, 사용자 정의 자료형의 값일 수도 있다.
배열의 각 요소는 메모리 블록의 연속적인 위치에 저장된다. 배열을 통해 여러 데이터를 순차적으로 저장할 수 있다.
구조체는 여러 다른 자료형을 한 묶음으로 관리할 수 있는 C언어의 자료형이다. 구조체 인스턴스의 각 멤버는 메모리 블록에 연속적으로 배치된다.
객체 지향 프로그래밍 언어에서 객체의 속성과 메서드에 대한 정보가 메모리에 저장된다. C언어에서는 객체 지향 프로그래밍을 직접적으로 지원하지 않지만, 구조체와 함수 포인터를 사용하여 비슷하게 구현할 수 있다.
함수의 주소를 저장하여, 나중에 해당 주소를 통해 함수를 호출할 수 있다. 이를 통해 동적으로 함수를 호출하거나 콜백 함수를 구현할 수 있다.
728x90
'CS > 메모리 관리' 카테고리의 다른 글
Register, RAM, ROM, Disk (0) | 2024.03.26 |
---|---|
Call by Value vs Call by Reference, Garbage Collection (1) | 2024.03.23 |
Malloc-lab 구현(first-fit, next-fit, best-fit) (1) | 2024.03.23 |
힙과 스택, 프로세스와 스레드 (1) | 2024.03.23 |
버퍼, DMA(Direct Memory Access) (2) | 2024.03.23 |