Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 동적 메모리 할당을 활용해 요소 집합에서 짝수·홀수의 합 구하기

C 프로그래밍에서 배열 크기를 미리 정하지 않고 사용자 입력에 따라 메모리를 확보하려면 동적 메모리 할당이 필수입니다. 이 글에서는 malloc() 함수를 이용해 필요한 만큼 메모리를 할당한 뒤, 저장된 요소들 중 짝수의 합과 홀수의 합을 각각 계산하는 프로그램을 단계별로 살펴봅니다.

문제 정의

동적 메모리 할당 함수를 사용하여, 입력받은 요소 집합 안에서 짝수의 합홀수의 합을 각각 구하는 것이 목표입니다.

해결 접근 방식

핵심 아이디어는 간단합니다. 포인터 산술 연산으로 각 요소에 접근한 뒤, 2로 나눈 나머지(% 2)가 0이면 짝수, 그렇지 않으면 홀수로 판별하여 누적 합계에 더합니다.

짝수 판별 및 합산 로직

for(i = 0; i < n; i++) {
    if(*(p + i) % 2 == 0) {      // 짝수 여부 검사
        even = even + *(p + i);  // 짝수들의 합 누적
    }
}

홀수 판별 및 합산 로직

짝수 조건에 해당하지 않는 모든 수는 홀수이므로, else 블록에서 처리하면 됩니다.

for(i = 0; i < n; i++) {
    if(*(p + i) % 2 == 0) {      // 짝수인 경우
        even = even + *(p + i);
    } else {                     // 홀수인 경우
        odd = odd + *(p + i);    // 홀수들의 합 누적
    }
}

전체 예제 코드

아래 코드는 원본 예제에서 발견되는 두 가지 문제점을 보완했습니다. 첫째, 원본에서는 n 값을 입력받기 전에 malloc()을 호출하는 순서 오류가 있었는데, 올바른 순서(입력 → 할당)로 수정했습니다. 둘째, 대문자 Else처럼 잘못 표기된 부분을 표준 C 문법에 맞게 정리하고, 사용이 끝난 메모리를 free()로 해제하도록 개선했습니다.

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

int main(void) {
    // 변수 및 포인터 선언
    int i, n;
    int *p;
    int even = 0, odd = 0;

    // 요소 개수 입력
    printf("Enter the number of elements : ");
    scanf("%d", &n);

    // malloc으로 기준 주소 p 확보
    p = (int *)malloc(n * sizeof(int));

    // 메모리 할당 성공 여부 반드시 확인
    if (p == NULL) {
        printf("Memory not available");
        exit(0);
    }

    // for문으로 각 위치에 요소 저장
    printf("The elements are : \n");
    for (i = 0; i < n; i++) {
        scanf("%d", p + i);
    }

    // 짝수·홀수 판별 후 각각 합산
    for (i = 0; i < n; i++) {
        if (*(p + i) % 2 == 0) {
            even += *(p + i);
        } else {
            odd += *(p + i);
        }
    }

    // 결과 출력
    printf("The sum of even numbers is : %d\n", even);
    printf("The sum of odd numbers is : %d\n", odd);

    free(p);  // 동적으로 할당한 메모리 해제
    return 0;
}

실행 결과

Enter the number of elements : 5
The elements are :
34
23
12
11
45
The sum of even numbers is : 46
The sum of odd numbers is : 79

핵심 정리

  • malloc(n * sizeof(int))으로 실행 시간에 필요한 크기만큼 메모리를 확보할 수 있습니다.
  • malloc() 반환값이 NULL인지 반드시 검사해야 메모리 부족 상황을 안전하게 처리할 수 있습니다.
  • *(p + i)p[i]와 동일하게 동작하며, 포인터 산술로 배열 요소에 접근하는 대표적인 방법입니다.
  • 나머지 연산자 %를 활용하면 짝수·홀수 판별을 한 줄의 조건식으로 처리할 수 있습니다.
  • 동적 메모리는 사용 후 free()로 반드시 해제해야 메모리 누수를 방지할 수 있습니다.