11장 메모리와 포인터 – 11.2 메모리 동적 할당 및 관리

C언어 – Inflearn, 독하게 시작하는 C 프로그래밍

11.2 메모리 동적 할당 및 관리

malloc()과 free() 함수는 메모리를 동적으로 할당 및 해제하는 함수이다. malloc() 함수는 인수로 전달받은 정수만큼의 바이트 단위 메모리를 동적으로 할당하고 주소를 반환한다. 이 주소는 할당받은 메모리 전체에 대한 기준주소이다. 따라서 이 주소를 기준으로 나머지에 접근(사용)할 수 있다. 그리고 사용이 끝난 다음에는 반드시 free() 함수를 이용해 메모리를  운영체제에 반환해야 한다. 이때, free() 함수의 인수로는 malloc() 함수가 반환한 기준주소를 명시해야 한다.

출력

malloc() 함수의 반환 자료형은 ‘void *’이고 pList의 자료형은 ‘int *’로 서로 다르다. 이 때문에 void *를 int *로 강제 형 변환하였다. C언어에서는 이 강제 형변환을 수행하지 않아도 되지만 C++에서는 매우 강력하게 이 문제를 지적한다. 따라서 소스코드의 호환을 위해 대부분 형변환을 추가하는 것이 일반적이다.

void *에서 void는 길이도 해석방법도 없다는 의미이다. 즉, 본질이 포인터인 것은 맞지만, 이 주소가 가리키는 대상 메모리를 어떤 형식(자료형)으로 해석할지는 아직 결정되지 않았음을 의미한다.

위의 free(pList); 코드는 동적 할당한 메모리를 해제하는 코드이다. 이를 주석처리해도 실행결과는 달라지지 않지만, 이는 매우 심각한 오류이다. 할당은 받았으나 반환하지 않은 메모리는 사용할 수 없기 때문이다. 이처럼 개발자의 실수로 메모리가 사용할 수 없는 상태가 되는 것을 ‘메모리 누수(memory leak)’라고 한다.

 

메모리 초기화 및 사용(배열)

memset() 함수의 두 번째 인수에 기술 할 수 있는 값은 0~255 사이의 숫자로 제한된다. 그 이유는 1바이트 즉, 8비트로 표현 할 수 있는 범위로 제한되기 때문이다. calloc() 함수는 malloc() 함수와 달리 할당받은 메모리를 0으로 초기화하여 전달한다.

출력

char szBuffer[] = { “Hello” }; 위의 이 코드는 지역변수인 szBuffer 배열이 사용하는 스택메모리의 초깃값이 되는 것이지만, char *pszBuffer = “Hello”; 에서는 데이터 영역 중 읽기전용 영역 어딘가에 “Hello”라는 문자열이 저장되고 첫 글자인 ‘H’가 저장된 기준주소가 포인터의 초깃값이 됩니다. 이는 메모리 동적 할당이 아니다.

 

메모리 복사

출력

 

메모리 비교(memcmp(), strcmp())

출력

 

strcmp()함수 사용해보기

출력

 

strstr() 함수 사용해보기

출력

 

배열 연산자 풀어쓰기

출력

 

댓글 남기기

Close Menu