////
Search

동적 메모리 할당

C 표준 라이브러리 <stdlib.h>

동적?

동적(dynamic) : 프로그램 실행 중(runtime)에 필요한 만큼 메모리를 확보하는 것

동적 할당이 필요한 이유

정적 할당(EX : int arr[100];)은 컴파일 타임에 크기가 고정되어, 프로그램 실행 중에는 크기를 변경할 수 없음 → 낭비되는 공간이 생기거나 더 큰 크기가 필요할 수도 있음
동적 할당을 사용하면, 필요한 시기에 필요한 만큼의 크기를 메모리에서 확보해 그때그때 사용 가능 (데이터 크기나 개수를 실행해봐야 아는 경우에 유용)

동적 메모리 할당 - 기억해야할 점들

1) 반드시 free로 해제

안 하면 메모리 누수(memory leak) 발생

2) 할당 후 NULL 체크 필요

확보할 메모리 공간이 부족하면 NULL을 반환하므로, 할당 직후 메모리 공간을 확보했는지 체크하기 위해 NULL인지 확인하는 습관 들이기

3) free 후 포인터는 NULL로 초기화

동적으로 할당한 메모리를 해제한 경우, 그걸 가리키고 있던 포인터를 NULL로 초기화해주지 않는다면 dangling pointer 오류가 발생할 수 있음
참고) dangling pointer
더 이상 유효하지 않은 메모리를 가리키고 있는 포인터(포인터 변수가 주소값은 갖고 있지만 그 주소의 메모리는 이미 해제되었거나 사라진 상태)

4) 구조체, 2차원 배열 등도 동적 메모리 할당 가능

#include <stdio.h> #include <stdlib.h> #define ROW 4; #define COL 3; int **matrix; // matrix : 행을 가리키는 포인터들의 배열 matrix = (int **)malloc(ROW * sizeof(int *)); for(int i=0; i<COL; i++) { // matrix[i] : int를 가리키는 포인터(= i번째 행의 첫 요소 주소) matrix[i] = (int *)malloc(COL * sizeof(int *)); } // 코드.. // // 코드 끝.. // 사용 이후 for(int i=0; i<ROW; i++) { free(matrix[i]); } free(matrix);
C
복사

코드

#include <stdio.h> #include <stdlib.h> int main() { int *arr; int n; // 배열의 원소 개수를 입력 개수만큼만 생성하고자 함 printf("원소 개수 입력 : "); scanf("%d", &n); // 동적 메모리 할당 arr = (int *)malloc(n * sizeof(int)); if(arr == NULL) return 1; // 동적으로 확보한 메모리 공간이 부족하지 않은지 체크 // 확보한 공간만큼에 원소 값 추가 for(int i = 0; i<n; i++) { arr[i] = i + 1; } // 출력 for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); free(arr); // 메모리 해제 return 0; }
C
복사