목차
동적 할당 함수
C언어에서 메모리 동적 할당은 프로그램 실행 중에 필요한 메모리 공간을 할당받는 것을 의미한다. 이는 프로그램의 유연성을 증가시키고, 필요한 만큼의 메모리만 사용할 수 있게 한다.
malloc, free 함수
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수 사용을 위한 헤더 파일
int main(void)
{
int* pi; // 동적 할당 영역을 연결할 포인터 선언
double* pd;
pi = (int*)malloc(sizeof(int)); // 메모리 동적 할당 후 포인터 연결
if (pi == NULL) // 동적 할당에 실패하면 NULL 포인터 반환
{
printf("# 메모리가 부족합니다.\n"); // 예외 상황 메시지 출력
exit(1); // 프로그램 종료
}
pd = (double*)malloc(sizeof(double));
*pi = 10; // 포인터로 동적 할당 영역 사용
*pd = 3.4;
printf("정수형으로 사용 : %d\n", *pi); // 동적 할당 영역에 저장된 값 출력
printf("실수형으로 사용 : %.1lf\n", *pd);
free(pi); // 동적 할당 영역 반환
free(pd);
return 0;
}
소개
malloc
함수는 지정된 크기의 메모리 블록을 할당하고, 그 메모리 블록의 주소를 반환한다. 할당된 메모리는 반드시 free
함수를 사용하여 해제해야 한다. stdlib.h 헤더 인클루드
원형
void* malloc(size_t size);
void free(void* ptr);
사용법
int *ptr = (int*)malloc(sizeof(int) * 5); // 정수형 공간 5개 할당
if (ptr != NULL) {
for (int i = 0; i < 5; i++) {
ptr[i] = i;
}
}
free(ptr); // 사용 후 메모리 해제
동작
malloc
함수는 요청된 크기의 메모리 블록을 힙 영역에서 찾아 할당하고, 시작 주소를 반환한다. 할당된 메모리 공간은 초기화되지 않으므로, 사용자가 명시적으로 초기화해야 한다.
사용시 주의사항
- 할당 실패 시 NULL 반환: 메모리 할당이 실패하면
malloc
함수는 NULL을 반환한다. 따라서 할당 후 NULL 체크는 필수다. - 메모리 누수:
malloc
으로 할당된 메모리는 반드시free
로 해제해야 한다. 해제하지 않으면 메모리 누수가 발생한다.
동적 할당을 배열처럼 쓰기
의미와 필요성
동적 할당을 배열처럼 사용하면, 프로그램 실행 도중에 배열의 크기를 조정할 수 있다. 이는 고정된 크기의 배열로는 처리할 수 없는 다양한 크기의 데이터 처리를 가능하게 한다.
예시코드와 설명
int *arr = (int*)malloc(sizeof(int) * 10); // 동적 배열 생성
if (arr != NULL) {
for (int i = 0; i < 10; i++) {
arr[i] = i * 2;
}
}
free(arr); // 사용 후 메모리 해제
기타 동적 할당 함수
calloc 소개 및 원형
calloc
함수는 메모리 블록을 할당하고, 0으로 초기화한다.
void* calloc(size_t num, size_t size);
realloc 소개 및 원형
realloc
함수는 이미 할당된 메모리 블록의 크기를 변경한다.
void* realloc(void* ptr, size_t newSize);
예제 소스코드 및 설명
int *arr = (int*)calloc(10, sizeof(int)); // 0으로 초기화된 10개의 정수 공간 할당
arr = realloc(arr, 20 * sizeof(int)); // 크기를 20으로 조정
if (arr != NULL) {
for (int i = 0; i < 20; i++) {
arr[i] = i;
}
}
free(arr);
프로그램이 사용하는 메모리 영역과 그 특징
프로그램은 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 구분된다.
- 코드 영역: 프로그램의 실행 코드가 저장된다.
- 데이터 영역: 전역 변수, 정적 변수가 저장된다.
- 힙 영역: 동적 할당을 통해 메모리
가 할당되고 해제되는 영역이다.
- 스택 영역: 함수 호출 시 생성되는 지역 변수와 매개변수가 저장된다.
동적 할당 저장 공간의 활용
필요성
동적 할당은 프로그램의 유연성을 높여주며, 실행 시점에 필요한 메모리를 할당하여 자원의 효율적 사용을 가능하게 한다.
동적 할당을 사용한 문자열 처리
char *str = (char*)malloc(100 * sizeof(char)); // 문자열 공간 할당
if (str != NULL) {
strcpy(str, "Hello, dynamic memory allocation!");
}
free(str); // 사용 후 메모리 해제
동적 할당 영역에서 저장한 문자열을 함수로 처리하는 예와 주의사항
문자열을 동적 할당으로 처리할 때는 할당된 크기를 넘어서는 작업을 하지 않도록 주의해야 한다. 예를 들어, strcpy
함수 사용 시 할당된 크기를 확인하고 사용해야 메모리 오버플로를 방지할 수 있다.
main함수의 명령행 인수 사용
int main(int argc, char *argv[]) {
for (int i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
return 0;
}
명령행 인수를 사용하면 프로그램 실행 시 입력 값을 동적으로 받을 수 있다. 이를 통해 프로그램의 유연성을 더욱 높일 수 있다.
https://velog.io/@pyotato/Week06C-Malloc-lab
[Week06][C] Malloc-lab
👩💻Dynamic Memory Allocation in the Heap : Malloc & free(힙공간에서의 동적메모리 할당)👩💻computer systems 9장👩💻 implicit list , explicit list & seglist
velog.io