반응형

 

1. 메모리 할당 방법

◆ 정적 메모리 할당(static memory allocation)

  • 프로그램이 시작되기 전에 정해진 크기의 메모리를 배열과 같은 방법으로 미리 할당받는 방식입니다.
  • 메모리를 모두 사용하지 않으면 남는 공간이 발생하게 됩니다.

      예]  학생 10명의 성적을 처리하기 위해 정수형 데이터 10개의 정적 메모리를 선언합니다.

      -학생 8명의 성적 처리만 수행하였다면 10개 메모리 공간 중에서 7개를 사용하고 나머지 7개는 빈 공간으로 남겨두게 되어 메모리 공간이 낭비됩니다.

c언어 정적메모리

 

◆ 동적 메모리 할당(dynamic memory allocation)

  1. 프로그램을 실행하는 도중에 필요에 따라 운영체제로부터 메모리를 할당받아 사용한 후 메모리 사용이 끝나면 반납하는 방식입니다
  2. 정적 메모리 할당보다 메모리를 효율적으로 관리할 수 있으므로 메모리 낭비를 예방할 수 있습니다.

 

[ 크기가 10개를 동적 배열 sp 선언 방법 ]

#include <stdio.h>
#include <stdlib.h>   //malloc() 함수를 사용하기 위해선언
int main()
{
	......
	
	//포인터 변수(*sp)를 선언하여 동적 메모리 주소로 사용
	int *sp;                     

	// 정수 10개를 저장할 수 있는 동적 메모리 할당 
	sp = (int *)malloc(10 * sizaof(int));

	return 0;
}

 

◆ malloc() 함수

  1. 동적 메모리를 할당할 때 사용하며 바이트 단위로 메모리를 할당합니다.
  2. 실행 시간을 조금이라도 단축하여 효율성을 제공하기 위해 메모리를 초기화하지 않습니다.
  3. 그러므로 필요에 따라서는 자신이 원하는 값으로 초기화할 수 있습니다.
  4. malloc( ) 함수의 원형은 <stdlib.h> 헤더 파일에 정의되어 있으며 메모리가 부족할 경우 NULL반환합니다.
  5. malloc( ) 함수를 사용할 때는 반환값이 NULL인지 항상 살펴봐야 합니다.

 

 

2. 동적 메모리 사용

▶ 동적 메모리 할당의 2가지 방법

  1. 포인터사용
  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. 동적 메모리 반납

동적 메모리 반납 함수

  1. 동적 메모리를 malloc(10 * sizeof(int));와 같이 선언하면 시스템에서 동적으로 할당받는 메모리 크기가 40(10x4)바이트로 제한되어 확보됩니다.
  2. 할당받은 동적 메모리 사용이 끝나면 다른 프로그램이 사용할 수 있도록 메모리를 반납해야 합니다.
  3. 메모리를 반납하지 않으면 할당된 동적 메모리는 해제되지 않습니다.

메모리 누수 : 동적 메모리를 반납하지 않아 다른 프로그램에서 메모리 공간을 그만큼 사용할 수 없게 되어 전체 프로그램이 서서히 느려지게 되는 현상입니다.

 

▶ free() 함수

  1. 동적 메모리를 반납할 때 사용합니다.
  2. 호출 형식 : 할당된 메모리를 가리키는 포인터를 인수로 하여 free(포인터) 형식으로 호출해야 합니다.
  3. 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
Posted by 명문코딩컴퓨터
,