'2차원 배열 동적할당.'에 해당되는 글 1건

  1. 2013.02.15 2차원 배열 동적할당. 2

2차원 배열같은 동적할당으로 아파트의 층과 가구를 사용자로부터 입력받아 메모리를 동적으로 할당한다.

그리고 인원을 입력하여 총 인원수를 출력하는 프로그램.

#include <stdio.h>
#include <stdlib.h>
main()
{
     int i,j;
     int height, width;         //2차원 배열의 인덱스를 위한 변수.
      int sum=0;                 //층당 인원 수.
      int total=0;                 //아파트 총 인원 수.
      int **arr;                     //2차원 배열의 동적할당을 위한 더블포인터.

      printf("아파트 총 층수: ");
      scanf("%d", &height);
      arr = (int**)malloc(sizeof(int)*height);             //arr의 열의 입력. arr[height][];

      printf("층당 가구수: ");
      scanf("%d", &width);
      for(i=0; i<height; i++)
           arr[i] = (int*)malloc(sizeof(int)*width);     //이렇게하면 arr[height][width]와 같은 것이 된다.

      for(i=0; i<height; i++)
      {
           printf("-----  %d층 -----\n", i+1);
           for(j=0; j<width; j++)
           {
                printf("%d층 %d호: ", i+1, j+1);
                scanf("%d", &arr[i][j]);

                sum += arr[i][j];
           }
           printf("\n%d층 총 인원: %d\n\n", i+1, sum);
           total += sum;
           sum = 0;
      }

      printf("아파트 총 인원: %d\n", total);

      printf("arr[0][0]의 주소: %d\n", &arr[0][0]);
      printf("arr[0][1]의 주소: %d\n", &arr[0][1]);
     printf("arr[1][0]의 주소: %d\n", &arr[1][0]);
     printf("arr[1][1]의 주소: %d\n", &arr[1][1]);
     printf("arr[2][0]의 주소: %d\n", &arr[2][0]);
     printf("arr[2][1]의 주소: %d\n", &arr[2][1]);

     for(i=0; i<height; i++)
           free(arr[i]); //메모리할당 했으면 반드시 해제도 해주어야 한다!!
     free(arr);  
      return 0;
}



정확히 말하면 2차원배열이 아니다. 왜냐하면,
배열은 메모리가 순차적으로 있어야 하는데.. 각 원소들이 메모리공간에 일정하게 있는야 하는데
동적할당으로 메모리를 할당하면 메모리 공간이 일정하지 않다. 
그래서, 정확히 2차원적 배열은 아니다.

결론, 2차원 배열처럼 활용할 수 있지만, 2차원 배열은 아니다!
그러면... 함수 전달할때는..?
2차원 배열이 아니니까 int**로 전달해주면 된다.

ex) void extendSize(int** pArr, ..., ...)

'Programming > C' 카테고리의 다른 글

수학 관련 함수  (0) 2013.02.15
ftell 함수와 rewind 함수  (0) 2013.02.15
fprintf와 문자열 형식  (0) 2013.02.15
조건부 컴파일  (0) 2013.02.15
모듈화 프로그래밍 (Modular Programming)  (0) 2013.02.15
Posted by scii
: