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

C 언어 동적 메모리 할당 활용법: n개 숫자의 합을 계산하는 예제 프로그램


문제

C 언어에서 동적 메모리 할당 함수를 사용하여 사용자가 입력한 n개의 숫자를 화면에 표시하고 그 합을 계산하려면 어떻게 해야 할까요?

해결 방법

다음은 C 언어로 작성된 프로그램으로, 동적 메모리 할당 함수를 활용해 사용자가 입력한 n개의 숫자를 저장하고 각 요소를 출력한 뒤 합계를 구합니다. 필요한 크기만큼만 메모리를 확보하기 때문에 고정 크기 배열을 사용할 때 발생하는 메모리 낭비도 함께 줄일 수 있습니다.

핵심 함수 살펴보기

malloc(): 요청한 바이트 크기만큼 힙(heap) 영역에 메모리를 동적으로 할당하고, 할당된 메모리의 시작 주소를 반환합니다. 할당에 실패하면 NULL을 반환합니다.

free(): malloc()으로 할당한 메모리 블록 전체를 해제하여 시스템에 반납합니다. 해제된 이후에는 해당 메모리의 내용이 더 이상 유효하지 않습니다.

예제 코드

#include<stdio.h>
#include<stdlib.h>
void main(){
   //변수와 포인터, 합계 선언//
   int numofe,i,sum=0;
   int *p;
   //사용자로부터 요소 개수 입력받기//
   printf("Enter the number of elements : ");
   scanf("%d",&numofe);
   //malloc() 함수 호출//
   p=(int *)malloc(numofe*sizeof(int));
   /*메모리가 성공적으로 할당되었는지 반드시 확인해야 하므로 if 문 사용*/
   if (p==NULL){
      printf("Memory not available");
      exit(0);
   }
   //요소 입력 및 합계 계산//
   printf("Enter the elements : \n");
   for(i=0;i<numofe;i++){
      scanf("%d",p+i);
      sum=sum+*(p+i);
   }
   printf("\nThe sum of elements is %d",sum);
   free(p);//할당된 메모리 블록 전체 해제//
   printf("\nDisplaying the cleared out memory location : \n");
   for(i=0;i<numofe;i++){
      printf("%d\n",p[i]);//쓰레기 값(garbage value)이 표시됨//
   }
}

코드 설명

프로그램은 먼저 사용자로부터 저장할 요소의 개수를 입력받고, malloc(numofe*sizeof(int))을 호출해 정수형 변수 numofe개에 해당하는 크기의 메모리를 힙 영역에 동적으로 확보합니다. 포인터 p가 NULL이라면 메모리 할당에 실패한 것이므로 안내 메시지를 출력하고 프로그램을 종료합니다.

이후 반복문을 통해 각 요소를 포인터 연산(p+i)으로 입력받으면서 동시에 합계를 누적하고, 모든 입력이 끝나면 총합을 출력합니다. 마지막으로 free(p)를 호출해 할당받은 메모리를 해제한 뒤, 해제된 메모리 위치의 값을 다시 출력해 보여줍니다.

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Enter the number of elements: 4
Enter the elements:
23
45
67
89
The sum of elements is 224
Displaying the cleared out memory location:
7410816
0
7405904
0

결과 분석

입력한 네 개의 숫자 23, 45, 67, 89의 합이 224로 올바르게 계산된 것을 확인할 수 있습니다. 흥미로운 부분은 free(p) 호출 이후입니다. 해제된 메모리 위치를 다시 출력하면 7410816, 0, 7405904, 0과 같은 의미 없는 쓰레기 값이 나타납니다.

이는 메모리가 해제된 후 해당 영역의 데이터가 더 이상 유효하지 않으며, 운영체제나 다른 프로그램에 의해 언제든 덮어써질 수 있음을 보여주는 좋은 예입니다. 따라서 실무에서는 free()로 메모리를 해제한 뒤에는 해당 포인터를 더 이상 참조하지 않는 것이 안전하며, 가능하다면 포인터를 NULL로 초기화하는 습관을 들이는 것이 좋습니다.