C언어 : 동적 메모리 할당 예제

지환·2022년 1월 19일
0

C언어

목록 보기
27/37
post-thumbnail

이번 시간에는 동적 메모리 할당을 사용해서 이름을 입력 받고 출력하는 예제를 진행하겠다.

동적 할당을 일컫는 말은 힙 영역을 뜻한다.

동적 메모리 할당을 사용해서 이름을 입력받고 출력하는 예제를 살펴보겠다.

<코드>

#include <stdio.h>
#include <malloc.h>


int main()
{
    char* p_temp;
    p_temp = (char*)malloc(40);//40바이트를 동적할당한다.
    if (p_temp != NULL)
    {
        printf("너의 이름을 입력해 > \n");
        gets(p_temp);
        printf("~%s이야.\n", p_temp);
        free(p_temp); //free를 통해서 동적 할당을 해제했다.

    }
    else {
    
        printf("제대로 된 값을 입력해!!!!");
    }

}

<결과>

<중요코드1>

 if (p_temp != NULL)
    {
        printf("너의 이름을 입력해 > \n");
        gets(p_temp);
        printf("~%s이야.\n", p_temp);
        free(p_temp); //free를 통해서 동적 할당을 해제했다.

    }
  • if문을 통해서 포인터 p_temp가 제대로 할당 됐는지 예외처리를 진행했다. 제대로 할당 되지 않았더라면 else 문이 실행 됐을 것이다.
  • 확실히 필자가 직접 메모리를 할당해서 입력하는 형식이다 보니 컴파일 하는 시간이 길었다. 적재 적소에 메모리를 할당하는 것을 많이 연습해야겠다.

다음 예제는 정적 메모리 할당을 사용해서 숫자를 입력 받고 합산 하는 예제다.

<코드>

#include <stdio.h>
#define MAX_COUNT 5
int main()
{
    int arr[MAX_COUNT], count = 0, sum = 0; 
    while (count < MAX_COUNT)
    {
        printf("숫자를 입력하세요 : (8888를 누르면 자동종료)");
        scanf_s("%d", arr + count); // 즉 count만큼 값을 입력하고 저장하겠다는 의미다.
        if (count == 8888)
            break; // 만약에 사용자가 8888를 입력했으면 break를 통해서 빠져나온다.
        count++;
    }
    for (int i = 0; i < count; i++) //여기서는 값을 누적하고 더하는 부분을 뜻한다.
    {
        if (i > 0) printf("+"); 
        // 맨 마지막 콘솔창에 나오는 더하기 부분을 표시하기 위해 조건을 i > 0 무조건 실행 될 수 밖에 없는 조건을 걸었다.
        printf("%d", arr[i]); // 입력 받은 값들을 전부 다 출력한다.
        sum = sum + arr[i]; //sum 값에 arr[i] 값을 더해 sum에 저장한다.
    }
    printf(" == %d\n", sum);


}

<결과>

<중요 코드 1>

    while (count < MAX_COUNT)
    {
        printf("숫자를 입력하세요 : (8888를 누르면 자동종료)");
        scanf_s("%d", arr + count); // 즉 count만큼 값을 입력하고 저장하겠다는 의미다.
        if (count == 8888)
            break; // 만약에 사용자가 8888를 입력했으면 break를 통해서 빠져나온다.
        count++;
    }
  • scanf_s("%d", arr+count)의 의미는 scanf+s("%d", &arr[count])와 같다.
  • if문을 통해서 예외처리를 작성했다.

<중요 코드 2>

for (int i = 0; i < count; i++) /
    {
        if (i > 0) printf("+"); 
   
        printf("%d", arr[i]); 
        sum = sum + arr[i]; //sum 값에 arr[i] 값을 더해 sum에 저장한다.
    }
    printf(" == %d\n", sum);
  • 여기서는 값을 누적하고 더하는 부분을 뜻한다.
  • 맨 마지막 콘솔창에 나오는 더하기 부분을 표시하기 위해 조건을 i > 0 무조건 실행 될 수 밖에 없는 조건을 걸었다.
  • for문을 통해 배열을 돌면서 arr[i] 값을 출력한다.

조금 더 확장해서 동적 메모리를 할당하고 숫자를 입력 받아 합산하는 예제를 풀어보자.

<코드>

#include <stdio.h>
#include <malloc.h>

int main()
{

    int* p_num_list, limit = 0, count = 0, sum = 0, i;
    printf("입력할 개수를 입력하세요 : ");
    scanf_s("%d", &limit); // 사용자로부터 값을 입력 받는다. 
    p_num_list = (int*)malloc(sizeof(int) * limit); // 사용자로부터 입력 받은 값을 동적 할당으로 사용한다.
    while (count < limit)
    {
        printf("숫자를 입력하세요 : (8888를 누르면 종료한다. : ");
        scanf_s("%d", p_num_list + count); // 이 의미는 &p_num_list[count]와 동일하다.
        if (*(p_num_list + count) == 8888) break; 
        //만약에 포인터(대상이 가리키고 있는 값이 8888) == (사용자가 입력하는 값이 8888이라면) 빠져나와라. 
        count++;
    }
    for (int i = 0; i < count; i++)
    {
        if (i > 0) printf("+");
        printf("%d", *(p_num_list + i)); //앞에선 p_num_list를 arr[i]로 표현했다. 둘이 같은 표현이다. *(arr+i) 로도 표현가능하다.
        sum = sum + *(p_num_list + i);
    }
    printf(" = %d\n", sum);
    free(p_num_list);
}

<결과>

  • 앞 예제와 큰 차이는 없지만, 표현 방식의 차이가 있다.
  • arr[i] == *(arr + i)는 같은 뜻이다.
  • 마지막에 동적할당을 해제하는 부분을 잊으면 안된다.
profile
아는만큼보인다.

0개의 댓글