크기가 고정된 배열을 사용 => 크기가 변할 수 있는 배열을 어떻게 선언할 수 있는지에 대한 고민에서 출발하는 일!
C언어에서 배열을 선언: 고정 크기의 배열 선언
1 2
int numArr[10] // 10 : 고정크기 => 10개의 요소를 가지는 배열
직관적으로 가변 길이 배열 선언해보기
1 2 3 4 5 6 7 8 9 10 11 12 13
#define _CRT_SECURE_NO_WARNING #include<stdio.h>
intmain() { intsize;
scanf("%d", &size); // 배열의 크기를 입력받음
int numArr[size]; // GCC에서는 사용 가능, Visual Studio 2015에서는 컴파일 에러
return0; }
컴파일러마다 다르지만, VS2015의 경우 컴파일 에러가 발생한다고 한다 => 동적으로 지정하기 위해서는 포인터를 선언하고, 메모리를 할당한 뒤 메모리를 배열처렁 사용해야한다!
포인터에 할당된 메모리를 배열처럼 사용하기
포인터를 배열처럼 사용하는 방법: 포인터에 malloc 함수로 메모리를 할당하여 사용하기! malloc: dynamic memory allocation 방법. 메모리를 필요할 때 할당하여 사용, 다 쓴 메모리는 free를 통해 반드시 해제해줘야함! malloc을 이용하기 위해서는 stdlib을 추가해줘야한다!
#include<stdio.h> #include<stdlib.h> // malloc, free 함수가 선언된 헤더 파일
intmain() { int row, col;
scanf("%d %d", &row, &col);
// 2차원 배열 선언 시작 int **m = malloc(sizeof(int *) * row); // 이중 포인터에 (int 포인터 크기 * row)만큼 // 동적 메모리 할당. 배열의 행
for (int i = 0; i < row; i++) // 세로 크기만큼 반복 { m[i] = malloc(sizeof(int) * col); // (int의 크기 * col)만큼 동적 메모리 할당. 배열의 열 } // 2차원 배열 선언 끝
// 2차원 배열에 값 할당 시작 for (int i = 0; i < row; i++) // 행 크기만큼 반복 { for (int j = 0; j < col; j++) // 열 크기만큼 반복 { m[i][j] = i + j; // 2차원 배열의 각 요소에 i + j 값을 할당 } } // 2차원 배열에 값 할당 끝
for (int i = 0; i < row; i++) // 행 크기만큼 반복 { for (int j = 0; j < col; j++) // 열 크기만큼 반복 { printf("%d ", m[i][j]); // 2차원 배열의 인덱스에 반복문의 변수 i, j를 지정 } printf("\n"); // 가로 요소를 출력한 뒤 다음 줄로 넘어감 }
// 2차원 배열 메모리 해제 시작 for (int i = 0; i < row; i++) // 행 크기만큼 반복 { free(m[i]); // 2차원 배열의 열 공간 메모리 해제 }
free(m); // 2차원 배열의 행 공간 메모리 해제 // 2차원 배열 메모리 해제 끝