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 |
[출처] 2차원 배열 동적할당|작성자 gigar
이런 방법으로 두면
1.↑ 2.↑ 3.↑
1번 부분에 char 형태로 1byte씩 첫번째 scanf값이 들어가고
2번 3번 부분도 차례대로 들어가는 형식이 된다.
'Basic > C' 카테고리의 다른 글
스택, 구조적, 객체지향 프로그래밍에 관한 간단한 내용 (0) | 2015.11.16 |
---|---|
배열, 포인터 몇가지 정리내용 (0) | 2015.11.16 |
난해한 포인터들 정리 (0) | 2015.03.07 |
포인터, 구조체, typedef (0) | 2015.03.07 |
연산자 , 프로토타입 정의 , 기억 클래스, 선행 처리기 (0) | 2015.03.07 |