본문 바로가기

공부생각/C/C++/C#

[C언어] 배열을 동적할당하기


C언어에서는 C++이나 JAVA와 달리 

int a[userinputSize] ;
또는
int a[] = new input[size]


이런식으로 어떠한 변수나 입력값이 변수길이에 오지 못하게 제어해놓았다.
그럼 문제는 유저가 이 배열을 몇개나 쓸꺼냐 하는 것을 미리 알지 못하기 때문에,
이러한 배열을 만들어서 사용하려면 동적할당을 이용해야 한다.

-참고로... 무식한 방법인 int a[1000]; 과 같은 방법을 사용해버리면, 돌아는 간다. 하지만 그대는 전산학도로서 발전이 없으리라... 저상태에서 유저가 배열을 10개정도만 사용한다면 990개의 메모리 공간이 버려지는 셈이다. 전산의 생명은? 효율!

C언어에서 동적할당 하는 방법을 메모해 놓고자 한다.


1. 일차원배열

int *input;
int staticSize = (유저로부터 입력값받음);
input = (int*)malloc(sizeof(int)*staticSize);


간단하다.
포인터를 사용하고 저렇게 할당하면 아무 붙임 없는 input이라는 identifier는 두번째줄에서 할당된 배열의 가장 처음을 가르키가 된다. 그 가르킨 위치에서 int에 맞는 크기를 staticSize만큼 할당하라는 얘기다. 즉, JAVA 에서

int input[] = new Integer[staticSize];

하고 똑같은 이야기이다.



2. 다차원배열

int **input;
int staticSize = (유저로부터 입력값받음);
input = (int(*)[])malloc (sizeof(int*)*10);               //가
input[0] = (int*)malloc(sizeof(int*)*staticSize);    //나

이차원배열을 예로 들면 이렇게 된다.
일차원배열과 다른점을 위주로 설명하면,
이중포인터인 **input으로 설정해주고, 메모리 할당을
행과 열을 각각 해줘야 한다.

열에서 하는것이 사용할 행의 갯수 만큼의 할당이다. 행은 10개의 행을 갖는 배열이고,
열에서 하는것이 사용할 열의 갯수 만큼의 할당이다. 여기서 일차원배열과 같이 인풋값을 입력받아 사용하는 것으로 대체하였다.