학습(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]와 동일하다고 볼 수 있습니다.
그리고, 동적으로 할당할 때는 메모리 해제를 주의해야 합니다.
'C Programming > 연습 문제' 카테고리의 다른 글
[C언어 연습문제]강좌 12. Printing Tokens(문자열 토큰을 사용한 출력) (0) | 2019.03.26 |
---|---|
[C언어 연습문제]강좌 11. Array Reversal(배열 반전, 요소 뒤집어 출력) (0) | 2019.03.22 |
[C언어 연습문제]강좌 9. Printing Pattern using Loops(숫자가 둘러진 대칭 사각형 패턴 인쇄하기) (0) | 2019.03.19 |
[C언어 연습문제]강좌 8. Bitwise Operators(과제를 통한 비트 연산자의 활용) (0) | 2019.03.18 |
[C언어 연습문제]강좌 7. For Loop in C(C언어 for문) (0) | 2019.02.27 |