메모리 동적 할당의 개념
C언어에서의 기억공간
- 프로그램 실행을 위해 기억공간 필요
- 기억공간은 운영체제에서 할당
- 할당되는 기억공간의 영역
- 데이터 영역
- 힙 영역
- 스택 영역
기억공간의 확보 방법
메모리 정적 할당
- 기억공간의 데이터 영역과 스택 영역 이용
- 프로그램을 작성하는 단계에서 필요한 기억공간의 크기 결정
메모리 동적 할당
- 기억공간의 힙 영역 이용
- 프로그램이 실행 중에 자료에 맞는 기억공간의 크기를 결정
기억공간의 할당 영역
- 데이터 영역 : 전역변수와 Static 변수가 저장되는 영역
- 힙 영역 : 프로그래머의 필요에 의해 할당/ 소멸이 이루어지는 영역
- 스택 영역 : 지역변수와 매개변수가 저장되는 영역
기억공간의 할당 영역
- 데이터 영역 : 프로그램이 시작하면서 할당되고, 종료되면 소멸
- 힙 영역 : 실행되면서 크기가 늘어나고 줄어들기 때문에 자유 기억공간이라 불리며, 동적 할당에 사용됨
- 스택 영역 : 함추 호출이 완료되면 사라진다
메모리 정적할당
- 변수 선언이나 배열 선언과 같이 프로그램을 작성하는 단계에서 기억공간의 크기 결정
- 할당시켜 줘야 할 기억공간의 크기를 명확히 알고있을 경우
- 프로그램이 시작될 때 미리 기억공간의 크기를 고정하여 할당
메모리 정적할당의 장/단점
- 쉽게 기억공간을 사용할 수 있고, 에러 발생 확률을 줄일 수 있다
- 사용할 기억공간의 크기를 알지 못하거나, 사용되는 자료의 크기 차이가 심하다면 기억공간의 낭비를 하게된다
메모리 동적할당
int size;
char *a;
sanf("%d", &size);
a = (char *)malloc(sizeof(char) * size);
free(a)
메모리 동적할당의 장단점
- 힙 영역을 이용하여 자료의 크기에 맞게 기억공간 확보
- 배열의 크기를 실행 중 정의해야할 경우
- 기억공간의 크기 지정과 재조정이 가능
- 시간이 지체되는 단점이 있다.
메모리 동적 할당 순서
- 포인터를 이용하여 동적할당 받을 변수 선언
- malloc() 함수 등을 이용하여 동적 할당
- 동적 할당된 변수 사용이 끝나면 free()함수를 이용하여 기억공간 해제
동적할당 함수
- malloc() calloc() realloc() free()
malloc()
형식 : void *malloc(size);
사용 예 : (int *) malloc(sizeof(int));
int size; char* str; str = (char\*)malloc(size + 1); if(str==NULL){ puts("동적 할당 실패"); exit(1); } free(str);
인자로 받고자 하는 기억공간의 크기를 byte 단위로 전달
힙 영역에 크기만큼 공간 할당, 할당한 공간의 첫번째 주소 반환
void*로 명시하여 어떤 형으로든 형 변환 가능
초기화 안됨 (초기화를 위해서는 memset() 사용)
free()
힙 영역에 할당된 공간은 프로그램이 종료될 때 까지 유지됨
명시적으로 해제하지 않으면 기억 공간의 부족 현상 발생
형식 : void free(void *p);
calloc()
힙 영역에 기억공간 할당
calloc()은 0으로 초기화 됨
형식 : void * calloc(n, sizeof(int);
realloc()
재할당
이미 할당 받은 기억 공간의 크기를 변경할 때 사용
형식 : void * realloc(void *p, int size);
기억공간 관리를 위한 함수
- memcmp() memcpy() memset()
memcmp()
기억 공간에 들어있는 자료를 주어지는 크기만큼 비교
형식 : int memcmp(void *s1, void *s2, size)
주어진 포인터에 할당된 크기를 byte 단위로 비교
#include <stdio.h>
#include <mem.h> // 메모리 관리 헤더 파일
void main(){
char *s1 = "aaa";
char *s2 = "bbb";
int stat;
stat = memcmp(s1, s2, 3); // s1 > s2 면 양수, s1 == s2면 0, s2가 크면 음수
// s2가 더 크기 때문에 -1
printf("%d", stat);
}
memcpy()
자료를 다른 기억 공간으로 복사
형식 : void *memcpy(void *dest, const coid *src, size_t n);
src에서 n byte만큼 dest에 복사
(char *)emecpy(dest, src, strlen(src));
이미 더 큰 자료가 들어있는 곳으로 복사를 하면 정해진 byte만큼 덮어쓰기 되고 나머지 내용은 유지 됨
memset()
기억 공간의 자료를 지정한 문자로 채운다
할당된 기억 공간 초기화나 내용 삭제를 위해 주로 사용
형식 : void *memset(void *s, intc, size_t n);
포인터 s가 가리키는 곳을 c의 값으로 n byte 만큼 채운다
memset(s, '*', strlen(s));
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어) 파일처리함수(2) (0) | 2021.04.03 |
---|---|
C언어 - 파일처리 함수(1) (0) | 2021.03.26 |
C언어 - 구조체와 공용체(2) (0) | 2021.03.23 |
C언어 - 11. 구조체와 공용체 (0) | 2021.03.21 |
C언어 - 10. 배열과 포인터 (3) (0) | 2021.03.17 |
댓글