포인터 변수에 동적 메모리를 할당하면, 배열처럼 사용할 수 있다.
▲동적 메모리 할당 malloc 함수는 이 글에 잘 설명되어있으니 참고하자.
정리에 앞서 먼저 배열이란 무엇인가??
▲구체적인 설명은 이 글을 참조하자.
배열이란 같은 종류의 데이터 타입을 선언하기 위해 구성된 데이터의 집합이다. 그리고 각 요소는 인덱스를 통해 참조할 수 있다.
그렇다면, malloc함수를 통해 메모리 주소를 할당하고 포인터 변수를 활용해 배열처럼 할 수 있는 방법도 있을까? 답은 Yes이다.
malloc 함수, 포인터 변수를 사용해 동적 메모리를 할당함으로써, 배열처럼 만들 수 있는 방법이 있다. 밑의 예제를 보자
●동적메모리 할당해서 배열처럼 활용하기 코드 예제
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
int *numPtr;
numPtr = malloc(sizeof(int) * 9);// int 9개 크기만큼 동적 메모리주소 할당
numPtr[0] = 10; // 배열처럼 인덱스로 접근하여 값 할당 (*numPtr 로 역참조한 방법이랑 다름)
numPtr[8] = 20; // 배열처럼 인덱스로 접근하여 값 할당 (*numPtr 로 역참조한 방법이랑 다름)
printf("%d\n", numPtr[0]); // 배열처럼 인덱스로 접근하여 값 출력
printf("%d\n", numPtr[8]); // 배열처럼 인덱스로 접근하여 값 출력
free(numPtr); // 동적으로 할당한 메모리 해제
return 0;
}
10 | 20 |
numPtr [0] numPtr [8] ↖메모리는 이런 모양으로 되어있는 것.
(배열 같지 않은가? index로 참조할 수 있다!!)
주의할 점
*배열처럼 하려면 반드시 sizeof(int) *n 곱하기 형식으로 되어있어야 함.
동적 메모리를 할당하여 1차원 배열로 활용할 수 있다면 2차원 배열도 동적 메모리를 통해 만들 수 있지 않을까? YES
포인터 변수에 동적 메모리를 할당하여 2차원 배열로 활용
●코드 예제
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
//3행 4열의 2차원 배열을 만들어보자
int** m; //이중포인터 변수 선언
m = malloc(sizeof(int*) * 3);// int* 3개 크기만큼 동적 메모리주소 할당
for (int i = 0; i < 3; i++)
{
m[i] = malloc(sizeof(int) * 4);
}
for (int i = 0; i < 3; i++) //2차원 배열의 요소에 i+j 값 넣고 출력
{
for (int j = 0; j < 4; j++)
{
m[i][j] = i + j;
printf("%d", m[i][j]);
}
printf("\n");
}
for (int i = 0; i < 3; i++)
{
free(m[i]); //동적으로 할당한 가로 공간 메모리 해제
}
free(m); // 동적으로 할당한 세로 공간 메모리 해제
return 0;
}
코드 해석
m = malloc(sizeof(int*) * 3);// int* 3개 크기만큼 동적 메모리주소 할당
1. int 대신 int* 를 사용한 이유는 컴퓨터 사용 환경에 따라 int와 int *의 메모리 크기가 다르기 때문이다.
위 코드를 통해 m은 int* size 크기의 메모리를 3개 할당 받는다.
m[0] |
m[1] |
m[2] |
for (int i = 0; i < 3; i++)
{
m[i] = malloc(sizeof(int) * 4);
}
이 코드를 통해 m [i]는 이제 int size 크기의 메모리를 4개 할당받는다.
m[0][0] | m[0][1] | m[0][2] | m[0][3] |
m[1][0] | m[1][1] | m[1][2] | m[1][3] |
m[2][0] | m[2][1] | m[2][2] | m[2][3] |
이렇게 이중 포인터를 통해 동적 메모리를 두 번 할 당하면, 2차원 배열의 모양이 등장한다.
m을 한번 참조하면 m [i]에 m [i][j]의 값의 메모리 주소가 등장한다. 그 메모리 주소를 한번 더 참조하면 m[i][j]의 값이 나오는 것이다.
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 24강) 문자열 포인터에 입력하기 (0) | 2020.11.13 |
---|---|
C언어 23강) 배열 형태의 문자열에 입력하기(scanf/char) (0) | 2020.11.13 |
C언어 21강) malloc함수로 메모리 사용하기 (0) | 2020.11.07 |
C언어 20강)+이중포인터 (0) | 2020.11.07 |
C언어 20강) void 포인터 (0) | 2020.11.06 |