×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,791,816명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

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번 부분도 차례대로 들어가는 형식이 된다.



반응형