본문 바로가기
ProgrammingLanguage/C언어

C언어 | 동적 메모리 할당 예제

by 씽쌩쏭 2021. 2. 16.
728x90

✅ 오늘의 문제 : 점수의 평균 구하기

 

학생의 수를 입력받은 뒤, 그 수만큼 학생의 점수를 입력받아 평균을 구하는 프로그램을 작성해보세요.

 

(코뮤니티 모각코 과정 中 출제되어 푼 문제입니다.)

 

 

실행예시!

 

학생의 수 : 10

학생1: 20
학생2: 30
학생3: 10
학생4: 93
학생5: 57
학생6: 88
학생7: 84
학생8: 70
학생9: 40
학생10: 55

평균: 54

 

초안

 

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

int main() {

	int student, sum = 0, avg = 0;

	printf("학생의 수 : ");
	scanf("%d", &student); //학생 수 입력 받기
	printf("\n");

	int* stuPtr1 = malloc(sizeof(int) * student); // (int 크기 * 입력 받은 크기)만큼 동적 메모리 할당
	//int* StuPtr1 = calloc(student, sizeof(int))


	for (int i = 0; i < student; i++) { //입력받은 학생 수 만큼 반복
		printf("학생%d : ", i + 1);
		scanf("%d", &stuPtr1[i]); //사용자로부터 값 할당받기
	}

	//평균 구하기
	for (int i = 0; i < student; i++) {
		sum += stuPtr1[i];
		avg = sum / student;
	}

	printf("\n\n평균 : %d\n", avg);

	free(stuPtr1);

	return 0;
}

 

평균을 좀 더 효율적으로 구할 수 있지 않을까...싶은데

생각이 안나서 코드인증 할 때 올려둠

그랬더니 매니저님이 두 반복문이 같은 작업을 하고있다구 어떻게 하는지 설명해주셔서

 

수정수정...

 

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

int main() {

	int student, sum = 0, avg = 0;

	printf("학생의 수 : ");
	scanf("%d", &student); //학생 수 입력 받기
	printf("\n");

	int* stuPtr1 = malloc(sizeof(int) * student); // (int 크기 * 입력 받은 크기)만큼 동적 메모리 할당
	//int* StuPtr1 = calloc(student, sizeof(int))


	for (int i = 0; i < student; i++) { //입력받은 학생 수 만큼 반복
		printf("학생%d : ", i + 1);
		scanf("%d", &stuPtr1[i]); //사용자로부터 값 할당받기
		sum += stuPtr1[i];
	}

	//평균 구하기
	avg = sum / student;

	printf("\n\n평균 : %d\n", avg);

	free(stuPtr1);

	return 0;
}

훨씬 깔끔해졌다!

 

출력 예시

 

 

정적 메모리, 동적 메모리 비교...

  정적 메모리 동적 메모리
장점 메모리 누수 걱정X 메모리 낭비 X
단점 메모리 공간의 크기가 정해져 있다.
(큰 공간의 경우 추가해줄 수 없고,
작은 공간의 경우 메모리 낭비가 발생!!)
메모리 누수 걱정해야됨 ( free()함수를 통해 해결)

 

 

메모리 누수란?

더보기

메모리 누수(memory leak) 현상:

컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상.

할당된 메모리를 사용한 다음 반환하지 않는 것이 누적되면 메모리가 낭비된다.

즉, 더 이상 불필요한 메모리가 해제되지 않으면서 메모리 할당을 잘못 관리할 때 발생한다.

일부 서적에서 메모리 손실이라는 용어로 뜻을 옮기기도 하지만 

leak라는 표현은 단순히 잃는 것 이상의 개념이므로 누수라는 표현이 더 정확하다.