IT_Programming/C · C++

[C] 동적 메모리 할당으로 다이아몬드 찍기

JJun ™ 2009. 5. 27. 16:12

참... 오랜만에 만져 보는 C언어.. (리눅스 gcc)

 

==================================================================================================

#include <stdio.h>

// malloc()과 memset()을 사용하기 위해서 추가
#include <stdlib.h>
#include <string.h>

 

#define STAR '*'
#define BLANK ' '

 

char** init(const int size);
void insertStar(char **p, const int size);
void Print(char **p, const int size);
void finish(char **p, const int size);

 

int main(void)
{
       int size = 0; 
       char **p;
 
       while(1) // 홀수 입력받을 때까지 반복
       {
              printf("배열의 사이즈를 입력하세요.(홀수만 가능!) "); 
              scanf("%d", &size);

            

               if((size % 2) == 1)
                         break; 
              else
                      continue; 
       } 
 
       p = init(size);
       insertStar(p, size);
       Print(p, size);
       finish(p, size); 
 
       return 0;
}

 

char** init(const int size)
{
       int i;

      

       // 2차원 메모리 초기화
       char **p = (char **)malloc(sizeof(char *) * size); // 행 할당 (size = 행)
       for(i=0; i<size; ++i) // 행 카운트
       {
                *(p+i) = (char *)malloc(sizeof(char) * size); // 열 할당 (size = 열)
                memset(*(p+i), BLANK, size);                    // 빈공백 문자(' ')로 초기화
       }

      

       return p;
}

void insertStar(char **p, const int size)
{
       int i, j, tmp, count;
       count = 0;
 
       // 별표 집어넣기
       tmp = size / 2;
       for(i=0; i<size; ++i)
       {
               for(j=tmp-count; j<=tmp+count; ++j)
              {
                     p[i][j] = STAR;
              }

            

              (i < tmp)? count++ : count--;
       }
}

 

void Print(char **p, const int size)
{
       int i, j; 

      

        // 출력
       for(i=0; i<size; ++i)
       {
             for(j=0; j<size; ++j)
             {
                     printf("%c", p[i][j]);
             }

            

             printf("\n");
       }
}

 

void finish(char **p, const int size)
{
       int i;

        

       if(p) // 메모리가 해제 되지 않았다면...

       { 

       // 2차원 메모리 해제
       for(i=0; i<size; ++i)
       {  
              free(p[i]); // 행을 날린다.
       }

                   free(p);      // 동적 메모리 해제

                   p = NULL;  // 남아 있는 해제된 메모리의 시작 주소를 없앤다. (댕글링 포인터 방지)

      } 

}

 

==================================================================================================