나의 IT일지
동적 메모리 할당 2 본문
동적 할당 메모리란 프로그램의 실행 도중, 할당 받은 메모리로, 정적 메모리를 사용하면 메모리의 낭비가 생기는 것을 방지하기 위해 사용된다.
- 동적메모리는 "stdlib.h"안에 있는 "malloc()"함수를 사용하여 메모리를 실행 도중에 생성 하는 것
- "malloc()"함수는 주소값이 결과값으로 나오기 때문에, 포인터에 저장해서 사용해야 한다. 즉 "포인터 = (포인터형*)malloc(sizeof(자료형));"를 통해 포인터에 주소를 저장
- malloc함수의 결과는 void*형이기 때문에 포인터와 같은 자료형으로 맞추기 위해서 (포인터형*)을 사용해서 결과값의 형태를 변경
우리는 동적메모리를 통해 변수 뿐만 아니라 배열을 만들 수 있다. 배열을 만드는 방법은 "malloc()"함수의 매개변수가 "sizeof(자료형)* 변수개수"를 하면 배열이 완성이 된다. 이것은 1차원 배열뿐만 아니라, 다차원배열에서도 사용이 된다.
동적 할당 메모리 - 2차원 배열
2차원 배열을 만들 때에는 이중포인터를 사용해야 한다. 이중포인터란 포인터의 주소를 저장하는 포인터이다.
위의 그림은 이차원 배열을 주소를 통해 배열에 접근하는 것을 표현한 것이다. 즉, 포인터에 주소를 저장해서 접근하는 것이 가능하다. 그리고 그 포인터들의 주소를 저장하는 이중포인터를 사용하면, 이중포인터 1개로 이차원 배열에 접근할 수 있게 된다.
- include <stdlib.h> 추가하여, malloc() 함수 사용
- 배열의 주소를 가진 포인터를 저장할 이중포인터 생성
- 1차원 배열을 생성할 단일 포인터 생성
- 단일 포인터와 이중포인터 모두 free
위의 과정을 토대로 코드를 작성하면 다음과 같다.
#include<stdio.h>
#include<stdlib.h>
void main() {
//int arr[3][4];
int a = 1, row, col;
printf("행의 갯수:");
scanf_s("%d", &row,sizeof(int));
printf("열의 갯수:");
scanf_s("%d", &col,sizeof(int));
int** dparr;
dparr = (int**)malloc(sizeof(int*) * row);
for (int i = 0; i < col; i++) {
dparr[i] = (int*)malloc(sizeof(int) * col);
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
dparr[i][j] = a++;
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("%4d",dparr[i][j]);
}
printf("\n");
}
for (int i = 0; i < row; i++) {
free(dparr[i]);
}
free(dparr);
}
위의 코드를 보면 이중포인터인 "dparr"에 "(int**)malloc(sizeof(int*) * row);"를 저장한다. 이때 "(int**)malloc(sizeof(int*) * row);"은 정수형 포인터의 배열을 동적으로 만드는 명령어이다. 즉, 이중포인터에 1차원 정수형 포인터배열의 주소를 저장하는 과정이 된다.
첫번째 for문은 이중포인터 "dparr"에 저장되어 있는 정수형 포인터들에 1차원 정수형 배열의 주소를 각각 저장하는 과정이며, 두번째 for문은 정수형 배열에 데이터를 저장하는 과정이 된다.
'프로그래밍 언어 > C언어' 카테고리의 다른 글
구조체 배열 (1) | 2023.03.02 |
---|---|
구조체 기본 (0) | 2023.03.01 |
동적 메모리 할당 1 (0) | 2023.02.25 |
포인터 배열과 배열 포인터 (0) | 2023.02.24 |
이중 포인터 (0) | 2023.02.23 |
Comments