728x90

malloc, calloc, realloc은 C언어에서 동적 메모리 할당을 위해 사용되는 함수다.

  1. malloc (Memory Allocation)
    • void* malloc(size_t size) 형태다.
    • 지정된 크기의 메모리 블록을 할당하고, 할당된 메모리의 주소를 반환한다. 초기화하지 않으므로 메모리 내용은 예측할 수 없다.
    • 예: int* arr = (int*)malloc(10 * sizeof(int)); // int형 10개를 저장할 수 있는 공간 할당
  2. calloc (Contiguous Allocation)
    • void* calloc(size_t num, size_t size) 형태다.
    • 지정된 수(num)의 요소 각각이 size 크기인 메모리 블록을 할당하고, 모든 바이트를 0으로 초기화한다.
    • 예: int* arr = (int*)calloc(10, sizeof(int)); // int형 10개를 저장할 수 있는 공간을 할당하고 0으로 초기화
  3. 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

+ Recent posts