사이먼's 코딩노트

[C언어] 정적 및 동적 할당 본문

C언어

[C언어] 정적 및 동적 할당

simonpark817 2024. 2. 21. 16:20
  • 이번 시간에는 메모리를 효율적으로 사용하지 위해서 할당에 대해서 배워봅시다.

 

[정적 할당]

#include <stdio.h>

int main(){
    
    int arr[5];

    arr[0] = 1;
    arr[1] = 3;
    arr[2] = 5;
    arr[3] = 7;
    arr[4] = 9;

}
  • 위 코드는 최초에 arr 배열을 5칸으로 지정하여 선언하였다. 해당 프로그램이 실행되면 자동으로 메모리가 스택 지역에서 할당되며, 크기는 총 28바이트를 가진다.
  • 스택 지역은 지금과 같이 사용자가 배정한 칸 수 만큼 고정된 구역만 할당받을 수 있다.
  • 정적 할당의 단점은 프로그램 실행 중에도 배열의 공간을 변경할 수 없다. 또한 필요한 메모리 양을 잘못 계산해서 크게 할당받으면 메모리 낭비가 생긴다.
  • 정적 할당의 장점은 프로그램 시작과 동시에 자동으로 할당을 해주고, 자동으로 반납을 해준다는 것이다.

 

[동적 할당]

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 10

int main(void) {
    int* arr;
    int size;

    printf("관리하실 숫자를 입력해주세요 : ");
    scanf("%d", &size);

    arr = malloc(sizeof(int) * size);

    for(int i = 0; i < size; i++) {
        printf("%d번째 숫자를 입력해주세요 : ", i+1);
        scanf("%d", arr+i);
    }

    for(int i = 0; i < size; i++) {
        printf("%d번째 숫자 : %d\n", i+1, arr[i]);
    }

    free(arr);

    return 0;
}
  • 위 코드는 포인터 변수 arr을 생성하고 최초에 배열의 공간 수를 지정하지 않고, scanf를 통해 공간을 사용자가 임의로 지정하고있다. 해당 프로그램이 실행되면 스택 지역에 쌓이는 메모리의 크기는 포인터 변수인 arr의 8바이트와 size 변수의 크기 4바이트까지 총 12바이트이다.
  • 정적 할당과 다르게 동적 할당은 프로그램 실행 수동으로 힙 지역에서 배열 공간을 할당받는다.
  • 동적 할당의 대표적인 함수는 malloc() 이다.
  • 위 코드에서는 arr의 주소를 통해 배열의 크기를 수동으로 할당받고 있다.
  • 또한 동적 할당 함수를 사용하기 위해서는 상단에 #include <stdlib.h> 를 추가 작성해야한다.
  • 동적 할당의 단점은 프로그램 시작 중에 할당을 직접 받기 때문에 모든 것이 수동적으로 이루어진다.
  • 동적 할당의 장점은 프로그램 실행 중에 배열의 공간 크기를 변경할 수 있으며, 메모리를 효율적으로 사용할 수 있다.

 

[문제]

  • 다음은 공간도 만들고 값도 세팅해 주는 change() 함수를 구현해보세요.
#include <stdio.h>
#include <stdlib.h>


int* change() {
    int input;
    scanf("%d", &input);
    int* arr = malloc(sizeof(int) * input);

    arr[0] = 100;
    arr[1] = 200;
    arr[2] = 300;

    return arr;
}

int main(void) {
    int* arr = change();

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

    free(arr);

    return 0;
}
  • 문제가 요점은 동적 할당을 이용해서 배열의 공간을 사용자가 수동으로 직접 세팅하는 것이다.
  • arr 배열에 들어갈 각 공간의 값은 change() 함수를 통해서 구현된다.
  • change() 함수는 return값으로 배열을 반환해야 하고 최초에 포인터 변수 arr이 int로 선언되었기 때문에 int*로 함수 타입을 정한다.
  • input이라는 변수는 사용자가 직접 입력하는 정수이고 해당 정수가 배열 공간의 크기를 나타낸다.
  • 먼저 #include <stdlib.h> 헤더파일을 포함하고, 동적할당을 하기 위해서 malloc() 함수를 사용하며, 반드시 할당이 끝나는 순간에 free() 함수도 함께 써줘야한다.

 

[문제 2]

  • 다음은 사람의 인원수를 입력받고 입력받은 수만큼 사람의 나이를 입력하고 해당 값을 출력해보세요.
#include <stdio.h>
#include <stdlib.h>

#pragma warning (disable: 4996)

int main(void) {
    int input;

    printf("사람의 숫자를 입력해주세요. : ");
    scanf("%d", &input);

    int* arr = malloc(sizeof(int) * input);


    for(int i = 1; i <= input; i++) {
        printf("%d번째 사람의 나이를 입력해주세요 : ", i);
        scanf("%d", arr+i);
    }

    for(int i = 1; i <= input; i++) {
        printf("%d번째 사람의 나이 : %d\n", i, arr[i]);
    }

    free(arr);

    return 0;
}
  • 총 인원수를 입력받기 위한 input이라는 변수를 선언한다.
  • input으로 입력한 숫자 만큼 배열의 공간을 할당하기 위해서 동적 할당 함수인 malloc을 사용한다. malloc() 함수를 사용하기 위해선 코드 상단에 #include <stdlib.h> 헤더파일을 포함시켜야한다.
  • 예를 들어 input에 9라는 숫자를 입력했다면 배열의 공간은 총 9개 즉, 9명의 사람이 생성된 것이다.
  • 그 다음은 반복문을 통해 첫번째 사람부터 입력받은 input번째 사람까지 나이를 입력하고 마지막에 다시 같은 보폭 조건을 이용해서 각 사람의 나이를 출력한다.
  • 동적 할당이 끝나는 순간에는 free() 함수를 이용하여 종료시켜준다.

 

반응형

'C언어' 카테고리의 다른 글

[C언어] linked List  (2) 2024.02.28
[C언어] 구조체&동적 할당 문제풀이  (0) 2024.02.28
[C언어] 구조체(Struct)  (0) 2024.02.20
[C언어] 포인터&배열 문제풀이(2)  (0) 2024.02.19
[C언어] 포인터&배열 문제풀이(1)  (0) 2024.02.19