목차
메모리동적 할당이란
메모리 동적 할당이란 말 그대로 C 코딩중에 내가 원하는 크기를 가진 변수 공간을 만들겠다는 의미입니다. 우리가 흔히 int형 변수의 메모리 공간 크기는 4 byte 인 것을 잘 알 고 있습니다. 그리고 char 형 변수 공간은 1 byte입니다. 자 그런데, 나는 지금부터 변수를 선언할 것인데 이 변수의 크기는 133 byte 공간을 차지하고 싶다.
지금 까지 우리가 알고있는 변수 타입중에 133 byte를 가진 변수가 있을까요? 없습니다. 다만 방법은 있습니다. char[133] 배열 변수를 선언하면 133 byte 메모리 공간을 가지게 됩니다. 이런 원리와 동일합니다. 메모리 동적할당이란 연속적으로 나열된 메모리 공간을 새롭게 구성하는 것입니다. 배열과 동일하지만, 배열 변수는 프로그램이 컴파일 되기 이전에 이미 정해져있다면 메모리 동적 할당이란 프로그램이 실행되는 도중에 새롭게 생성되는 공간을 의미합니다.
malloc 함수 원형 설명
void *malloc(size_t size);
인자:
size
: 할당하려는 메모리의 바이트 단위 크기를 나타내는size_t
형의 정수 값.
반환 값:
malloc
함수는 할당된 메모리 블록의 시작 주소를 가리키는void
포인터 반환.- 만약 메모리 할당에 실패하면,
NULL
포인터가 반환됨.
설명:
malloc
함수는 힙(Heap) 메모리 영역에서 지정된 크기의 메모리 블록을 할당하여 반환합니다.- 할당된 메모리는 초기화되지 않으며, 사용하기 전에 필요한 초기화를 수행해야 합니다.
- 할당된 메모리는
free
함수를 사용하여 명시적으로 해제해야 합니다.
사용자가 입력한 크기만큼 메모리 동적할당 예제
아래는 외부로부터 사용자에게 바이트 단위의 메모리 동적할당을 위한 크기를 입력받아 동적 할당하는 예제입니다. malloc 함수 인자로 원하는 크기를 정수로 입력하면 됩니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
size_t size;
printf("할당할 메모리 크기를 입력하세요 (바이트 단위): ");
scanf("%zu", &size);
// 메모리 동적 할당
void *ptr = malloc(size);
if (ptr == NULL) {
printf("메모리 할당에 실패했습니다.\n");
return 1;
}
printf("메모리 할당 성공! 할당된 메모리의 주소: %p\n", ptr);
// 메모리 할당 해제
free(ptr);
return 0;
}
동적할당 포인터 변수에 문자열 입력 예제
다음으로 동적할당한 주소에 문자열을 입력하는 예제입니다. 하지만 반드시 공간크기보다 작게 값을 복사해야하는 것을 주의해야합니다. 만약 공간보다 큰 값을 저장할 경우 예기치 못한 오류가 발생할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
size_t size;
printf("할당할 메모리 크기를 입력하세요 (바이트 단위): ");
scanf("%zu", &size);
// 메모리 동적 할당
void *ptr = malloc(size);
if (ptr == NULL) {
printf("메모리 할당에 실패했습니다.\n");
return 1;
}
printf("메모리 할당 성공! 할당된 메모리의 주소: %p\n", ptr);
printf("문자열을 입력해주세요 : ");
scanf("%s", ptr);
printf("\n입력된 문자열 : %s\n\n", ptr);
// 메모리 할당 해제
free(ptr);
return 0;
}
free 함수로 리소스해제 예제
마지막으로 malloc 함수로 동적 할당한 공간은 반드시 프로그램 종료 이전에 free 함수로 리소스를 해제해주어야 합니다. 안그러면 메모리 릭이 발생하여 다른 프로그램이 메모리 공간을 사용하지 못해 예기치 못한 오류가 발생할 수 있습니다. 블루스크린 등이 이러한 문제입니다.
free(ptr);