1. 메모리 할당 방법 |
◆ 정적 메모리 할당(static memory allocation)
- 프로그램이 시작되기 전에 정해진 크기의 메모리를 배열과 같은 방법으로 미리 할당받는 방식입니다.
- 메모리를 모두 사용하지 않으면 남는 공간이 발생하게 됩니다.
예] 학생 10명의 성적을 처리하기 위해 정수형 데이터 10개의 정적 메모리를 선언합니다.
-학생 8명의 성적 처리만 수행하였다면 10개 메모리 공간 중에서 7개를 사용하고 나머지 7개는 빈 공간으로 남겨두게 되어 메모리 공간이 낭비됩니다.

◆ 동적 메모리 할당(dynamic memory allocation)
- 프로그램을 실행하는 도중에 필요에 따라 운영체제로부터 메모리를 할당받아 사용한 후 메모리 사용이 끝나면 반납하는 방식입니다
- 정적 메모리 할당보다 메모리를 효율적으로 관리할 수 있으므로 메모리 낭비를 예방할 수 있습니다.
[ 크기가 10개를 동적 배열 sp 선언 방법 ]
#include <stdio.h>
#include <stdlib.h> //malloc() 함수를 사용하기 위해선언
int main()
{
......
//포인터 변수(*sp)를 선언하여 동적 메모리 주소로 사용
int *sp;
// 정수 10개를 저장할 수 있는 동적 메모리 할당
sp = (int *)malloc(10 * sizaof(int));
return 0;
}
◆ malloc() 함수
- 동적 메모리를 할당할 때 사용하며 바이트 단위로 메모리를 할당합니다.
- 실행 시간을 조금이라도 단축하여 효율성을 제공하기 위해 메모리를 초기화하지 않습니다.
- 그러므로 필요에 따라서는 자신이 원하는 값으로 초기화할 수 있습니다.
- malloc( ) 함수의 원형은 <stdlib.h> 헤더 파일에 정의되어 있으며 메모리가 부족할 경우 NULL을 반환합니다.
- malloc( ) 함수를 사용할 때는 반환값이 NULL인지 항상 살펴봐야 합니다.
2. 동적 메모리 사용 |
▶ 동적 메모리 할당의 2가지 방법
- 포인터사용
- 배열 사용
[ 포인터 연산자 *를 사용하는 방법 ]
*sp = 88;
*(sp + 1) = 90;
*(sp + 2) = 86;
*(sp + 3) = 45;
......
[ 배열을 사용하는 방법 ]
sp[0] = 88;
sp[1] = 90;
sp[2] = 86;
sp[3] = 45;
4. 동적 메모리 반납 |
▶ 동적 메모리 반납 함수
- 동적 메모리를 malloc(10 * sizeof(int));와 같이 선언하면 시스템에서 동적으로 할당받는 메모리 크기가 40(10x4)바이트로 제한되어 확보됩니다.
- 할당받은 동적 메모리 사용이 끝나면 다른 프로그램이 사용할 수 있도록 메모리를 반납해야 합니다.
- 메모리를 반납하지 않으면 할당된 동적 메모리는 해제되지 않습니다.
메모리 누수 : 동적 메모리를 반납하지 않아 다른 프로그램에서 메모리 공간을 그만큼 사용할 수 없게 되어 전체 프로그램이 서서히 느려지게 되는 현상입니다.
▶ free() 함수
- 동적 메모리를 반납할 때 사용합니다.
- 호출 형식 : 할당된 메모리를 가리키는 포인터를 인수로 하여 free(포인터) 형식으로 호출해야 합니다.
- malloc( ) 함수가 반환한 포인터를 free( ) 함수의 인수로 선언해야 하며 반납한 동적 메모리를 더 이상 사용할 수 없습니다.
#include <stdio.h>
#include <stdlib.h> //malloc() 함수를 사용하기 위해선언
int main()
{
......
//포인터 변수(*sp)를 선언하여 동적 메모리 주소로 사용
int *sp;
// 정수 10개를 저장할 수 있는 동적 메모리 할당
sp = (int *)malloc(10 * sizaof(int));
free(sp);
return 0;
}
[ 동적 메모리 할당하기 예제 1 ]
- 국어, 영어, 수학 점수를 저장할 동적 메모리를 배열을 사용하여 할당하는 프로그램을 작성해보세요.
#include <stdio.h>
#include <stdlib.h> //malloc() free()함수를 사용하기 위해선언
int main()
{
int i;
//포인터 변수(*sp)를 선언하여 동적 메모리 주소로 사용
int *sp;
// 정수 3개를 저장할 수 있는 동적 메모리 할당
sp = (int *)malloc(3 * sizeof(int));
if(sp == NULL)
{
printf("동적 메모리 할당 오류\n");
exit(1); // 비정상 프로그램 종료
}
//동적 메모리 사용
sp[0] = 97; // *(sp) = 97;
sp[1] = 100; // *(sp+1) = 100;
sp[2] = 88; // *(sp+2) = 88;
printf("국어 점수 = %d\n", sp[0]);
printf("국어 점수 = %d\n", sp[1]);
printf("국어 점수 = %d\n", sp[2]);
free(sp);
return 0;
}
[ 동적 메모리 할당하기 예제 2 ]
- 입력받은 학생수 만큼 점수를 입력 받아 총점과 평균을 구하는 프로그램을 작성하세요.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, hap = 0, n;
int *sp;
float ave;
printf("학생수 : ");
scanf("%d", &n);
sp = (int *)malloc(n * sizeof(int));
if(sp == NULL)
{
printf("동적 메모리 할당 오류\n");
exit(1);
}
for(i=0;i<n;i++)
{
printf("%d번째 학생 점수 = ", i+1);
scanf("%d", &sp[i]);
hap += *(sp+i);
}
ave = (float)hap / (float)n;
printf("총점 = %d\n", hap);
printf("평균 = %.2f\n", ave);
free(sp);
return 0;
}
[ 구조체를 저장할 수 있는 동적 메모리 할당 예제 1 ]
- 번호, 이름, 국어, 영어점수를 저장할수 있는 구조체를 선언한 후 구조체를 저장할 수있는 동적 메모리를 할당하는 프로그램을 작성하세요.
- 구조체 배열이 필요할 경우 구조체 크기에 필요한 개수를 곱하여 사용합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
int no;
char name[10];
int kor;
int eng;
};
int main()
{
int i, hap = 0, n;
struct student *sp; // <----
sp = (struct student *)malloc(3 * sizeof(struct student)); // <---
if(sp == NULL)
{
printf("동적 메모리 할당 오류\n");
exit(1);
}
sp[0].no = 1;
strcpy(sp[0].name, "이말숙");
sp[0].kor= 90;
sp[0].eng = 96;
sp[1].no = 1;
strcpy(sp[1].name, "미달이");
sp[1].kor= 88;
sp[1].eng = 75;
sp[2].no = 1;
strcpy(sp[2].name,"코로나");
sp[2].kor= 100;
sp[2].eng = 96;
for(i=0;i<3;i++)
{
printf("번호 = %d\n", sp[i].no);
printf("이름 = %s\n", sp[i].name);
printf("국어점수 = %d\n", sp[i].kor);
printf("영어점수 = %d\n", sp[i].eng);
printf("=============\n");
}
free(sp);
return 0;
}
'C++ 언어' 카테고리의 다른 글
6. C/C++ 연결리스트 (0) | 2021.01.18 |
---|---|
5. C/C++ 함수 기초 (0) | 2020.11.23 |
3. C/C++ 연산자 (0) | 2020.09.25 |
2. C/C++ 함수 - 인수 전달 방법 (0) | 2020.09.24 |
1. C/C++ 구조체 정렬하는 방법 (0) | 2020.07.29 |