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
복사
