C.5-2 동적할당 malloc / free

lsw·2021년 3월 24일
0

C

목록 보기
7/9
post-thumbnail

1. 문제

띄어쓰기를 단어의 구분기준으로 하여, 문자열을 거꾸로 출력하여라.


2. 코드

#include <stdio.h>
#include <stdlib.h> // malloc, free
#include <string.h>

/*malloc & free*/
char* RReverse(int num); // function declaration

int main()
{
    int num, i, j; // 문자열의 길이, 반복문 변수
    char* str;
    int right; // 단어를 scanning할 끝점 변수
    printf("Enter the length : ");
    scanf("%d%*c", &num); // 문자열의 길이 입력
    str = RReverse(num); // 함수 불러들임
    right = strlen(str); // 문자열의 길이(integer)

    for(i=num; i >= 0; i--) //끝에서부터(num)
    {
        if ((int)str[i] == 32) // 띄어쓰기(space) " " -> 32 in ASCII(decimal) code
        {
            for (j = i+1; j <= right-2; j++) 
// space + 1 ~ right-2까지('\n'와 배열의 시작점이 0 임을 감안 -2) print
            {
                printf("%c", str[j]);
            }
            right = i+1; // i + 1 - 2 == i -1 (space point - 1)
            printf(" "); // 생략된 space를 붙여줌!
        }
        else if(i==0) // 시작점에 다다르면
        {
          for(j=0 ; j<= right-2 ; j++) // 시작점 기준(left) ~ right print
          {
            printf("%c", str[j]);
          }
        }
    }
    free(str); // 메모리 공간 비우기(not neccessary but preffered)
    return 0;
}

char* RReverse(int num)
{
    char* str = (char*)malloc(num); 
    /* malloc은 주소값을 반환한다. 따라서 char pointer type의 'str'선언, 
   malloc의 반환 타입은 void * 이며 이것은 활용가치가 없다! 따라서
   use type changer (char *), 메모리 할당 길이는 num(사용자 입력)으로 한다.
    */
    fputs("문자열 입력 : ",stdout);
    fgets(str, num, stdin); // gets는 불안정한 함수로 인식되어 fgets를 활용
    return str;

}

3. 결과


4. 결론

  1. malloc의 반환형은 void * 이기에 형식변환자가 반드시 필요하다
  2. free는 웬만해서 malloc과 함께 사용해 준다.
  3. 동적할당 방법의 변수 선언은 전역변수와 지역변수의 장점을 흡수한 것이다.
profile
미생 개발자

0개의 댓글