반응형
- 메모리 할당 유형:
- Static Memory allocation: 'intx;' 또는 'intar[10];'와 같은 변수를 선언하면 컴파일 시 자동으로 해당 변수의 메모리가 할당됩니다. 이 변수들의 크기와 수명은 고정되어 프로그램이 시작되는 시점을 알 수 있습니다.
- Automatic Memory Allocation: 함수에서 이런 일이 발생합니다. 함수가 호출되면 로컬 변수가 생성되고 함수가 종료되면 이 변수들이 파괴됩니다. 보통 스택이라는 메모리 영역에서 시스템의 런타임 환경에 의해 처리됩니다.
- C의 메모리 레이아웃:
- Stack: 자동변수(함수 파라미터, 로컬변수 등)를 저장하는 곳입니다. 크기가 제한되어 있습니다.
- Heap: 동적 메모리 할당에 사용되는 메모리 풀이 더 큽니다. 스택과 달리 크기가 고정되어 있지 않고 필요에 따라 증가할 수 있습니다.
- Data Segment: 여기에 정적 및 전역 변수가 저장됩니다.
- Code Segment: 컴파일된 프로그램 코드가 있는 곳입니다(C 함수 및 지침).
동적 메모리 할당
C의 동적 메모리 할당은 런타임 중에 메모리를 할당해야 할 때 사용되며, 이는 힙에서 수행됩니다. 특히 프로그램을 실행하기 전에 필요한 메모리의 크기를 모를 때 유용합니다.
- 'malloc' 함수:
- Usage: 'malloc'은 지정된 바이트 수를 할당하는 데 사용됩니다.
- Syntax: 'void* malloc(size_t size);'
- 예: 10개의 정수에 대해 메모리를 할당하려면 'int * ptr = malloc(10 * size of (int));'를 사용합니다
- Return Value: 할당에 실패할 경우 할당된 메모리 또는 'NULL'로 포인터를 반환합니다.
- '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'로 포인터를 반환합니다.
- 'realloc' 기능:
- usage: 이전에 할당된 메모리 블록의 크기를 조정하는 데 사용됩니다.
- Syntax: 'void* realloc(void* ptr, size_t size);'
- 예: 이전에 할당된 배열의 크기를 20개 정수로 변경하려면 'ptr = realloc(ptr, 20 * size of (int));';'
- Return Value: 새로 할당된 메모리 블록을 가리키는 포인터 또는 재할당에 실패할 경우 'NULL'.
- '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 |