메모리

Dohun Lee·2025년 7월 22일

C/C++

목록 보기
5/34
post-thumbnail

C/C++ 의 메모리

메모리 구조

  • 코드 영역: 이 영역에는 실행할 프로그램의 코드가 저장되는 메모리 공간이다. CPU는 이 영역에서 코드를 읽어 실행한다.
  • 데이터 영역: 전역 변수와 static 으로 선언 된 변수가 할당되는 메모리 영역이다. 이 영역에 할당된 변수는 프로그램 종료 시 까지 메모리에 남아있게 된다.
  • 스택 영역: 이 영역에는 지역변수와 매개 변수가 할당된다. 이 영역에 할당된 변수는 함수가 반환되면 소멸된다.
  • 힙 영역: 동적으로 할당되는 변수들의 값이 저장되는 곳. 원하는 시점에 할당과 해제가 가능한 변수가 저장되는 공간이다.

메모리 할당 관점에서의 프로그램 실행의 흐름

  1. 프로그램이 실행되고 나서 데이터 영역에 전역 변수와 static 변수를 할당한다.
  2. main 함수가 실행되고, main 함수 내부의 지역 변수들이 스택 영역에 할당된다.
  3. main 함수 내부에서 실행되는 함수들의 지역 변수들이 스택 영역에 할당되고, 함수가 반환되고 난 후 해당 함수 내부에 선언된 지역 변수들이 스택 영역에서 소멸된다.
  4. 마지막으로 main 함수가 종료되고, main 함수 내부의 지역 변수가 소멸되고, 프로그램이 종료된다. 이때, 할당된 메모리 공간 전체를 반환하게 된다.

메모리의 동적 할당과 해제

힙 영역의 메모리에 변수를 할당 하고 해제 하기 위해서는 malloc과 free 라는 함수를 통해 가능하다.

malloc

malloc은 기본적으로 void 타입의 포인터를 반환한다. 이 이유는 메모리를 할당할때, 특정 크기로 할당한다고 하더라도, 해당 변수가 4바이트의 char 배열인지, int 변수의 포인터인지를 판단할 수 없기 때문이다. 그렇기 때문에 malloc을 통해서 메모리를 할당할때, 반드시 사용할 변수의 타입의 포인터로 형변환을 해주어야 한다.

int* num = (int*)malloc(sizeof(int)); // 크기가 4 바이트인 int 포인터 선언
char* str = (char*)malloc(4); // 길이가 4인 char 배열의 선언

free

메모리의 동적 할당과 더불어, 사용하지 않는 메모리의 할당 해제는 매우 중요하다. 왜냐하면, 만약 사용한 메모리를 할당 해제하지 않아서 메모리 누수가 발생하게 되면, 프로그램의 성능 저하로 이어질수 있기 때문이다. 그렇기 때문에, 반드시 malloc 과 free는 함께 사용되어야 한다.

int* num = (int*)malloc(sizeof(int)); // 크기가 4 바이트인 int 포인터 선언
char* str = (char*)malloc(4); // 길이가 4인 char 배열의 선언

// 위에서 할당한 메모리를 해제하고 있다. 만약, 할당을 해제 하지 않으며면, 프로그램 종료 전까지 할당되고 사용되지 않는 공간이 힙 영역에 남아있게 된다.
free(num);
free(str);

그 외의 메모리 할당 방법

  • calloc: 이 함수는 malloc과 달리 두개의 인자를 넣어야 한다. 첫번째 전달 인자는 할당할 블록의 개수, 두번째 인자에는 할당할 블록의 크기가 전달 되어야 한다. 즉, calloc(4, sizeof(int))를 호출하면, int의 크기를 가진 4개의 블럭을 할당 해달라는 의미이다. int는 4바이트, 4개의 블럭이므로 총 4 * 4 = 16 바이트의 메모리 공간이 할당된다. 할당하는 방법 외에도 malloc과 다른점은, malloc으로 메모리를 할당 했을 때는, 할당된 메모리 공간이 쓰레기 값으로 초기화 되지만, calloc으로 할당 시에는 0으로 초기화 된다는 장점이 있다. 할당된 메모리의 해제 방법은 free를 통해서 할 수 있다.
  • realloc: 이 함수는 이미 malloc 혹은 calloc으로 할당 된 메모리 공간을 더 확장 하고 싶을때 사용할 수 있다. 이 함수는 두가지 방법으로 할당되는 공간을 확장한다. 첫번째 방법은 기존에 할당된 메모리 공간을 그대로 뒤로 이어서 할당하는 방법이다. 이때는 realloc이 반환하는 메모리 주소 값이, 기존의 메모리 주소와 동일하다. 두번째 방법은 새로운 힙 영역에 메모리 공간을 할당하는 방법이다. 만약 기존에 할당된 메모리 공간에 여유 공간이 없을때, 새로운 메모리 공간을 할당 한 후 기존 값을 복사한다. 이때는 기존 메모리 주소와 realloc이 반환하는 메모리 주소가 다르다.
profile
미국 공대생

0개의 댓글