반응형

2차원 배열 동적할당


2차원 배열을 동적할당해 주기 위해서

컴퓨터는 물리적으로 1차원 배열과 2차원 배열이 똑같기에

각각의 1차원 배열 주소값을 저장하는 포인터 변수가 필요하다.

 


2차원 배열이라고 해도, 물리적으로는 1차원 배열의 나열이다.

이 2차원 배열을 동적으로 할당하기 위해서는 2차원 배열()의 각각의 시작 주소값을 알고 있는

각각의 포인터 배열()이 필요하고

또다시 1차원 배열의 시작값을 담고있는 포인터배열의 시작 주소값을 알고있는 변수포인터가 필요한 것이다

 

그래서 하나의 정적할당과 2개의 동적할당이 필요하다

 

그렇다면 ① 과 ② 둘 중 어느것을 먼저 만들어야 할까

 

답은 ① 이다.

동적할당은 시작 주소값을 알고 있는 포인터 변수가 있어야 한다고 앞서 말했다.

시작값을 알고 있는 포인터 변수가 없으면 만들어도 쓰지 못하기 때문이다.

그래서 2차원배열의 시작 주소값을 가르킬 포인터 변수의 배열을 먼저 만들고, 그 후에 2차원 배열을 만드는 것이다.

 


 

 

선언부 - 동적할당을 선언해보자. (필요한 포인터 변수 선언은 생략)

1
2
3
4
ptr=(char**)malloc(sizeof(char*)*3); // 포인터배열 갯수
 *ptr=(char*)malloc(sizeof(char)*12); // 2차원배열 총 갯수
 for(i=1;i<3;i++)
  ptr[i] = ptr[0+ 4*i;
Crocus

 

입력부 - 만들었으면 한번 A부터 글자를 담아주자

1
2
 for(i=o; i<12; i++)
  ptr[0][i]='A'+i;        // ptr[0][i] ==  *(ptr[0]+i)
Crocus

 

출력부


1
2
3
4
5
6
 for(i=o; i<3; i++)
 {
  for(k=o;j<4;j++)
   printf("%d\t", ptr[i][j];
  printf("\n");
 }
Crocus

 

해제 - 해제는 역순으로 한다. ② → ① 순으로 한다.


1
2
 free(*ptr);
 free(ptr);
Crocus


( 출처 : http://blog.naver.com/gigar/60099872581 )




2차원 배열을 이용할때


만약 2차원 배열 각각에 이름을 할당할 때 라고 가정하면

 

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main()
{
 char a[10][10];
 int i;
 
 for(i = 0 ; i <= 5 ; i++)
 {
  scanf("%s",a[i];
 }
 
}
Crocus

이런 방법으로 두면 



1.↑       2.       3.   

                 

 1번 부분에 char 형태로 1byte씩 첫번째 scanf값이 들어가고


 2번 3번 부분도 차례대로 들어가는 형식이 된다.



반응형