코딩 -/C언어

2차원 배열의 동적할당

심프슨정리 2021. 7. 11. 16:37
반응형

2차원 배열을 동적 할당하는 방법에 대해 알아보도록 하겠습니다.

 

메모리의 크기가 정해져있지 않고 두개의 숫자로 입력이 들어올 때를 기준으로 생각합니다.

 

입력에 5 5 등이 들어오는 방식입니다.

 

5 5를 입력으로 받았다면 5행 5열

3 7을 입력으로 받았다면 3행 7열

각 행과 열을 뜻합니다.

 

이는 입력으로 들어올 입력값이 몇개인지  미리 지정되어있지 않고, 입력에서 주어지는 값으로 동적 할당하여 세팅을 해야 하는 경우 필요합니다.

 

 

2차원 문자 배열의 동적 할당을 예로 설명하겠습니다. 

 

int A,B;
scanf("%d %d",&A,&B);

char **arr; //char 더블포인터 선언
arr = (char**)malloc(sizeof(char*)*A);  //A칸 동적할당

for (int i=0;i<A;i++){
    arr[i] = (char*)malloc(sizeof(char)*B);	 //B칸 동적할당 후 A에 매치 (A번반복)
}

코드를 잠깐 설명하자면

B개의 문자를 저장할 수 있는 char 포인터가 A 개만큼있고 , 그 char 포인터를 가리키는 char 더블 포인터가 하나 있습니다.

그 더블포인터가 각각의 char 포인터를 가리킵니다.

 

예를 들면 좌측의 메모리가 char ** 포인터 arr이고 , A칸(포인터를 가리킬 수 있는 사이즈만큼 *A칸)의 메모리를 생성하였습니다.

그리고 이 생성된 arr을 arr[0]~ arr[A] 로 각각의 인덱스를 가리킬 수 있으며, 

이 각각의 인덱스에 문자 B개를 저장하여 가르킬 수 있는 포인터를 생성하여 가리키게 합니다.

(B칸짜리 문자 포인터 생성 후 그 포인터를 가리키게 함)

 

이를 각각의 인덱스만큼 반복하여 생성하면 총

(A*B) 칸짜리 메모리를 동적 할당하였고 이를 가리키는  + A 칸짜리 메모리를 동적 할당하였습니다.

 

이후 마지막에 짝으로 꼭 해줘야 하는 필수과정이 있습니다.

 

 

for (int i=0; i<A;i++){
    free(arr[i]);
}
free(arr);

이는 각각 

의 char 포인터를 메모리  반납

이후 char ** 를 반납입니다.

미리 소스 마지막에 추가해두시기 바랍니다.

 

댓글로 요청사항 주시면 그에 맞게 소스 추가해드리겠습니다.

반응형