본문 바로가기
프로그래밍 언어/C

C언어) 15. 메모리 동적 할당

by nomfang 2021. 4. 7.
728x90
반응형

메모리 동적 할당의 개념

C언어에서의 기억공간

  • 프로그램 실행을 위해 기억공간 필요
  • 기억공간은 운영체제에서 할당
  • 할당되는 기억공간의 영역
    • 데이터 영역
    • 힙 영역
    • 스택 영역

기억공간의 확보 방법

메모리 정적 할당

  • 기억공간의 데이터 영역과 스택 영역 이용
  • 프로그램을 작성하는 단계에서 필요한 기억공간의 크기 결정

메모리 동적 할당

  • 기억공간의 힙 영역 이용
  • 프로그램이 실행 중에 자료에 맞는 기억공간의 크기를 결정

기억공간의 할당 영역

  • 데이터 영역 : 전역변수와 Static 변수가 저장되는 영역
  • 힙 영역 : 프로그래머의 필요에 의해 할당/ 소멸이 이루어지는 영역
  • 스택 영역 : 지역변수와 매개변수가 저장되는 영역

기억공간의 할당 영역

  • 데이터 영역 : 프로그램이 시작하면서 할당되고, 종료되면 소멸
  • 힙 영역 : 실행되면서 크기가 늘어나고 줄어들기 때문에 자유 기억공간이라 불리며, 동적 할당에 사용됨
  • 스택 영역 : 함추 호출이 완료되면 사라진다

메모리 정적할당

  • 변수 선언이나 배열 선언과 같이 프로그램을 작성하는 단계에서 기억공간의 크기 결정
  • 할당시켜 줘야 할 기억공간의 크기를 명확히 알고있을 경우
  • 프로그램이 시작될 때 미리 기억공간의 크기를 고정하여 할당

메모리 정적할당의 장/단점

  • 쉽게 기억공간을 사용할 수 있고, 에러 발생 확률을 줄일 수 있다
  • 사용할 기억공간의 크기를 알지 못하거나, 사용되는 자료의 크기 차이가 심하다면 기억공간의 낭비를 하게된다

메모리 동적할당

int size;
char *a;
sanf("%d", &size);
a = (char *)malloc(sizeof(char) * size);

free(a)

메모리 동적할당의 장단점

  • 힙 영역을 이용하여 자료의 크기에 맞게 기억공간 확보
  • 배열의 크기를 실행 중 정의해야할 경우
  • 기억공간의 크기 지정과 재조정이 가능
  • 시간이 지체되는 단점이 있다.

메모리 동적 할당 순서

  1. 포인터를 이용하여 동적할당 받을 변수 선언
  2. malloc() 함수 등을 이용하여 동적 할당
  3. 동적 할당된 변수 사용이 끝나면 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

댓글