본문 바로가기
IT 톺아보기/이런저런 공부

C 프로그램의 메모리 이해

by 파초우 2024. 1. 29.
반응형
  1. 메모리 할당 유형:
    • Static Memory allocation: 'intx;' 또는 'intar[10];'와 같은 변수를 선언하면 컴파일 시 자동으로 해당 변수의 메모리가 할당됩니다. 이 변수들의 크기와 수명은 고정되어 프로그램이 시작되는 시점을 알 수 있습니다.
    • Automatic Memory Allocation: 함수에서 이런 일이 발생합니다. 함수가 호출되면 로컬 변수가 생성되고 함수가 종료되면 이 변수들이 파괴됩니다. 보통 스택이라는 메모리 영역에서 시스템의 런타임 환경에 의해 처리됩니다.
  2. C의 메모리 레이아웃:
    • Stack: 자동변수(함수 파라미터, 로컬변수 등)를 저장하는 곳입니다. 크기가 제한되어 있습니다.
    • Heap: 동적 메모리 할당에 사용되는 메모리 풀이 더 큽니다. 스택과 달리 크기가 고정되어 있지 않고 필요에 따라 증가할 수 있습니다.
    • Data Segment: 여기에 정적 및 전역 변수가 저장됩니다.
    • Code Segment: 컴파일된 프로그램 코드가 있는 곳입니다(C 함수 및 지침).

동적 메모리 할당

C의 동적 메모리 할당은 런타임 중에 메모리를 할당해야 할 때 사용되며, 이는 힙에서 수행됩니다. 특히 프로그램을 실행하기 전에 필요한 메모리의 크기를 모를 때 유용합니다.

  1. 'malloc' 함수:
    • Usage: 'malloc'은 지정된 바이트 수를 할당하는 데 사용됩니다.
    • Syntax: 'void* malloc(size_t size);'
    • : 10개의 정수에 대해 메모리를 할당하려면 'int * ptr = malloc(10 * size of (int));'를 사용합니다
    • Return Value: 할당에 실패할 경우 할당된 메모리 또는 'NULL'로 포인터를 반환합니다.
  2. 'calloc' 함수:
    • usage: 'malloc'과 유사하지만 'calloc'은 할당된 메모리를 0으로 초기화합니다.
    • Syntax: 'void* calloc(size_t num, size_t size);'
    • : 0으로 초기화된 10개의 정수의 경우: 'int * ptr = calloc(10, size of (int));'
    • Return Value: 할당에 실패할 경우 할당 및 초기화되지 않은 메모리 또는 'NULL'로 포인터를 반환합니다.
  3. 'realloc' 기능:
    • usage: 이전에 할당된 메모리 블록의 크기를 조정하는 데 사용됩니다.
    • Syntax: 'void* realloc(void* ptr, size_t size);'
    • : 이전에 할당된 배열의 크기를 20개 정수로 변경하려면 'ptr = realloc(ptr, 20 * size of (int));';'
    • Return Value: 새로 할당된 메모리 블록을 가리키는 포인터 또는 재할당에 실패할 경우 'NULL'.
  4. 'free' 기능:
    • usage: 'malloc', 'calloc' 또는 'realloc'에 의해 이전에 할당되었던 메모리를 해방합니다.
    • Syntax: 'void free(void* ptr);'
    • : 이전에 할당된 메모리를 비우려면: 'free(ptr);'
    • 중요도: 사용하지 않은 메모리를 다시 힙으로 풀어 메모리 누수를 방지합니다.

모범 사례 및 일반적인 실수
항상 반환 값 확인: malloc, calloc 또는 realloc이 NULL을 반환하는지 항상 확인하여 메모리 할당에 실패했음을 나타냅니다.
메모리 누수 방지: 메모리를 모두 사용한 후에는 항상 자유롭게 메모리 할당을 해제하십시오. 그렇지 않으면 메모리가 누출되어 프로그램에서 메모리가 계속 사용되고 있지만 액세스할 수 없습니다.
댕글링 포인터 주의: 메모리를 확보한 후 포인터를 NULL로 설정합니다. 이렇게 하면 댕글링 포인터(확보된 메모리를 참조하는 포인터)를 방지할 수 있습니다.
초보자용 예제
예제를 사용하여 이 점을 명확히 해 보겠습니다:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *array;
    int n = 10; // Number of elements

    // Dynamic allocation of array
    array = malloc(n * sizeof(int)); 

    if (array == NULL) {
        printf("Memory allocation failed!\n");
        return 1; // Exit if allocation failed
    }

    // Initialize the array with values
    for (int i = 0; i < n; i++) {
        array[i] = i;
    }

    free(array);
    array = NULL;

    return 0;
}

이 예제에서는 정수 배열을 동적으로 할당하고 사용한 다음 적절하게 할당을 취소합니다.

반응형

'IT 톺아보기 > 이런저런 공부' 카테고리의 다른 글

Naver map API를 이용하여 네이버 지도를 화면에 띄우기  (2) 2024.01.08
UART protocol  (1) 2023.05.24
LIN이란?  (0) 2023.05.08
memmove 사용법  (0) 2023.04.21
memset 사용법  (0) 2023.04.20