본문 바로가기
C Programming/연습 문제

[C언어 연습문제]강좌 10. 1D Arrays in C(malloc - 동적 배열 만들기)

by 희품 2019. 3. 20.
반응형


학습(Study) & 목표(Objective)

배열은 정해진 유형의 고정된 값을 갖는 컨테이너 객체입니다. C언어에서는 int arr[n]; 과같이 n의 크기를 갖는 정수형 배열 arr를 선언할 수 있습니다. int arr[n] 배열은 컴파일 시간에 메모리가 할당되는 정적 배열입니다. C언어에서는 malloc 함수를 사용하여 프로그램 실행 중에 heap 메모리에 동적으로 배열을 생성할 수 있습니다.


사이즈가 n인 정수형 배열 arr를 만드는 방법입니다.

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


여기서 arr는 배열의 처음 시작 주소를 갖는 포인터를 지칭합니다.


과제(Task)

이 연습문제에서는 배열의 크기, 배열의 요소를 입력받고, 크기가 n인 정수형 동적 배열을 생성하여 요소들의 합을 새로운 줄에 출력하는 문제를 풀어보도록 하겠습니다.


입력 형식(Input Format)

첫 줄에는 정수n 을 입력받습니다.

두 번째 줄에는 공백으로 구분된 정수를 n개 입력받습니다.


제약 조건(Constraints)


출력 형식(Output Format)

새로운 줄에 정수 배열 요소의 합을 출력합니다.


입력 예제(Sample Input) - 1

6

16 13 7 2 1 12 


출력 예제(Sample Output) - 1

51


입력 예제(Sample Input) - 2

7

1 13 15 20 12 13 2


출력 예제(Sample Output) - 2

76


주어진 코드

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */    
    return 0;
}


답안 코드

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
  
    int n, *arr, i, sum = 0;
    scanf("%d"&n);
    arr = (int*malloc(n * sizeof(int));
    for(i = 0; i < n; i++) {
        scanf("%d", arr + i);
    }
 
    for(i = 0; i < n; i++) {
        sum += *(arr + i);
    }
 
    printf("%d\n", sum);
    free(arr);
    return 0;
}


- 크기 n의 배열 arr은 코드와 같이 arr = (int*)malloc(n * sizeof(int)); 로 선언할 수 있습니다.

- 이 코드에서 malloc은 (n * int의 크기) byte만큼 블록의 메모리를 할당해서 블록 시작 부분의 포인터를 반환합니다.

- 배열의 각 요소에 입력하려면 scanf("%d", arr + i); 로 입력을 받을 수 있습니다. arr는 이미 배열의 첫 번째 요소의 주소를 가리키고 있어서, arr + i는 배열의 요소로 볼 수 있습니다.

- i 번째 배열 요소의 값에 접근하는 방법은 *(arr + i)로 사용할 수 있습니다.

- 전체 배열을 반복하고, 각 요소의 값을 더해 결과를 출력합니다.

- 동적으로 할당된 메모리는 임의로 해제를 시켜야 합니다.



해결된 코드

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int n = 0, sum = 0;
    int *arr = NULL;
    int i = 0;
 
    scanf("%d"&n);
    arr = (int *)malloc(n  * sizeof(int));
 
    for(i = 0; i < n; i++)
    {
        scanf("%d"&arr[i]);
    }
    for(i = 0; i < n; i++)
    {
        sum += arr[i];
    }
 
    printf("%d", sum);
 
    if(arr != NULL)
    {
        free(arr);
        arr = NULL;
    }
 
    return 0;
}


C언어에서 배열은 포인터로 구성됩니다. 동적으로 할당된 포인터 arr는 결국 배열과 같이 쓸 수 있습니다.

arr + i는 &arr[i]와 같습니다. 따라서 arr는 &arr[0] 과 같다고 볼 수 있습니다. 배열의 이름은, 메모리 주소의 시작 값, 처음 요소의 주솟값이라고 보면 됩니다.


참조 역시 *(arr + i)는 arr[i]와 동일하다고 볼 수 있습니다.

그리고, 동적으로 할당할 때는 메모리 해제를 주의해야 합니다.



반응형