9.3 메모리 동적 할당
메모리 정적 할당과는 달리 메모리 동적 할당 dynamic allocation 은 힙 영역을 이용하여 프로그램 실행 중에 입력되는 자료에 입력되는 자료에 맞게 기억공간을 확보한다. 메모리 동적 할당은 많은 기억공간을 한꺼번에 할당받아 배열로 사용할 수 있으므로 매우 효율적이다.
9.3.1 메모리 동적 할당의 장,단점
> 힙 영역을 이용하여 프로그램 실행 중에 입력되는 자료의 크기에 맞게 기억 공간을 확보
> 많은 자료를 처리하는 배열의 크기를 실행 시간에 정의해야 하는 경우에 특히 유용
> 프로그램 실행 시 기억 공간의 크기를 지정할 수 있고, 재조정이 가능
> 시간이 지체되는 단점이 있다.
9.3.2 메모리 동적 할당 순서
1) 기억공강을 동적으로 할당 받을 변수를 포인터를 이용하여 선언
2) malloc() 함수 등을 이용하여 기억공간을 동적으로 할당
3) 기억공간의 사용이 끝나면 free() 함수를 이용하여 기억공간 해제
9.3.3. malloc() 함수
> 형식 : void *malloc(size_t number_of_bytes);
> 기능 : number_of_bytes에서 주어지는 크기만큼 기억 공간을 동적으로 할당한다.
> 사용 예 : void *malloc(sizeof(int));
- 인자로 할당 받고자 하는 기억공간의 크기를 byte 단위로 전달
- 힙 영역에 그 크기만큼 기억 공간을 할당하고, 할당한 기억 공간의 첫 번째 주소를 반환
- void * 로 명시하여 어떤 형으로든 형 변환이 가능
- 초기화 안됨 (기억공간의 초기화를 위해서는 memset() 사용 )
9.3.4. free() 함수
> 형식 : void free(void*p)
> 기능 : 동적으로 할당된 기억 공간을 해제할 때 사용
- 힙 영역에 할당된 공간은 프로그램이 종료될 때까지 유지
- 할당된 기억 공간을 해제하지 않으면 기억공간의 부족 현상이 발생
- 명시적 반납이 필요
// 메모리 동적 할당 예
#include <stdio.h>
#include <stdlib.h> // 동적 할당 함수를 위한 헤더 파일
void main(){
int *a;
a = (int*)malloc(sizeof(int)); // 기억공간 할당
if(a == NULL){ // 기억공간 할당 성공 여부 판단
puts("기억공간 할당 실패!");
exit(1); }
*a = 20;
printf("힙에 저장된 변수 a : %d \n", *a);
free(a); } // 기억공간 해제
// 메모리 동적 할당 예2
#include <stdio.h>
#include <stdlib.h>
void main(){
int size; // 입력받을 문자 수 저장 변수 선언
char* str; // 동적 할당된 기억공간을 연결할 포인터
printf("문자열의 크기를 입력하세요 : " );
scanf("%d", &size);
str = (char*)malloc(size +1); // 입력받을 문자수 (size +1 )에 맞게 동적 할당
if(str == NULL){ // 기억공간 할당 성공 여부 판단
puts("기억공간 할당 실패!");
exit(1); }
printf("문자열을 입력력하세요 : ");
scanf("%s", str); // 동적으로 할당된 기억공간에 문자열 저장
printf("동적 할당된 메모리에 저장된 문자열 : %s\n", str);
free(str); }
'방송통신대학 > C 프로그래밍' 카테고리의 다른 글
복습 예제 C 언어의 개요 (0) | 2020.07.03 |
---|---|
기타 동적할당 함수 (0) | 2020.06.26 |
메모리 정적할당static aloocation (1) | 2020.06.24 |
순차 파일의 레코드 추가 (0) | 2020.06.21 |
순차 파일 읽기 getc() , fgetc(), fgets(), fscanf() (0) | 2020.06.20 |