1차원 동적 배열을 만드는 것은 단순히 다음과 같이 malloc()
함수를 이용하면 된다.
ex) 만약 사용자로부터 임의의 정수를 받은 후, 그 수의 크기에 해당하는 배열을 만든다고 가정을 하자.
int input_n;
scanf("%d", &input_n);
int *array = (int *)malloc(sizeof(int) * input_n);
• (int *)malloc(sizeof(int) * input)
: int 형의 input_n 칸짜리 배열을 메모리에 할당 후, 해당 주소를 반환
2차원 배열을 동적으로 할당하는 경우, 아래와 같이 크게 두 가지의 이슈가 있다.
• 배열의 원소가 인접해야하는지
• 배열이 가변적이어야 하는지
2차원 동적 배열 만들기
※ 2차원 동적 배열 만들기 요약
(1) 이중 포인터로 배열의 크기가 row인 포인터 배열을 생성
(2) 생성된 포인터 배열로 다시 한번 배열의 크기가 col인 배열을 생성
※ 2차원 동적 배열 예시
int **d_array = (int **)malloc(sizeof(int *) * row);
for(int i; i < row; i++){
array[i] = (int *) malloc(sizeof(int) * col);
};
// 동적 배열의 사용이 끝난 후, 메모리 해제
for(int i; i < row; i++){
free(array[i]);
};
free(array);
위 예시에 대한 설명은 아래의 그림을 통해서 확인할 수 있다.
※ 주의사항
사용이 완료된 동적 배열의 경우 반드시 free()함수를 사용함으로써, 메모리를 해제시켜줘야한다. 만약 메모리 해제를 하지 않는다면, 메모리 누수 (Memory leak)를 일으킬 수 있다. 2차원 동적 배열을 해제하는 방법은 생성한 순서의 역으로 해주면 된다.
(1) free(array[i])
(2) free(array)
※ NOTE: 불연속 메모리 할당과 인접한 메모리 할당
위와 같은 형식으로 2차원 동적배열을 만드는 경우, 먼저 바깥쪽 배열에 메모리를 할당한 다음 별도의 malloc() 함수를 이용하여 각 행에 메모리를 할당한다. 따라서 다시 한번 별도의 malloc() 함수를 이용하여 메모리를 할당하였기 때문에, 할당된 메모리가 인접해 있다고 보장할 수 없다.
따라서, 만일 동적 배열들이 인접한 메모리에 할당을 하기 원한다면, 아래와 같이 두 가지 방법이 있다.
a. 첫번째 방법
(1) 바깥쪽 배열을 먼저 할당
(2) 전체 행에 대한 메모리를 할당
int row = 2;
int column = 5;
// 1. 첫번째 단계
// - 첫 번째 malloc() 호출로 정수에 대한 포인터 배열을 할당.
// - 각 요소는 행에 대한 포인터를 가짐
int **matrix = (int**) malloc(row * sizeof(int));
// 2. 두 번째단계
// 배열의 모든 요소에 대한 메모리를 matrix의 첫번째 원소에 할당
matrix[0] = (int*) malloc(row * column * sizeof(int));
// 3. 세 번째 단계
// For 구문을 이용하여, 첫 번째 배열의 각 요소에 두 번째 malloc()에서 할당한 메모리의 일부를 지정
for (int i = 0; i < row; i ++){
matrix[i] = matrix[0] + i * column;
}
b. 배열에 필요한 모든 메모리를 한번에 할당
int *matrix = (int *) malloc(row * column * sizeof(int));
- 이 경우의 경우, 코드 안에서 배열을 참조할 때, 배열 첨자를 사용할 수 없음
- 배열의 인덱스를 다음과 같이 수동으로 계산해야 함
ex) matrix + (i * column) + j : matrix[i][j]에 대해 대응되는 배열의 인덱스
Reference:
[1] m.blog.naver.com/PostView.nhn?blogId=jsky10503&logNo=221261265884&proxyReferer=https:%2F%2Fwww.google.com%2F
[2] luyin.tistory.com/176
[3] luna-archive.tistory.com/3
[4] codeng.tistory.com/8
'프로그래밍 언어 > C, C++ 다양한 예시들' 카테고리의 다른 글
[C/C++] 대화식 입력의 예제 (0) | 2022.03.19 |
---|---|
[C/C++] 메뉴 선택 방식 (0) | 2021.08.24 |
[CUDA] 데이터 복사 예제 (0) | 2021.08.20 |
[C 언어] 텍스트 파일의 총 개행 수 구하기 (0) | 2021.02.06 |
[C 언어] 계층 구조의 하위 디렉토리 생성 (0) | 2021.01.30 |
댓글