학습 목표
! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.
- 동적할당 사용 이유와 방법 대해 이해한다.
- 동적할당 원리에 대해 간단히 이해한다.
1. 동적 할당 사용 이유
고객 100명의 나이를 배열에 저장해야하면 아래와 같이 코드를 작성할 수 있을 것이다. 하지만 값(100)보다 사람이 적다면 저장 공간이 낭비될것이고, 사람이 더 많아진다면 값을 늘려 컴파일 해야할 것이다. 만약 상용 프로그램이였다면 코드가 크니 컴파일 시간도 오래 걸릴것이고 배포도 해야하니 문제가 있다. 따라서 입력한 값 만큼 배열의 크기를 정할 수 있는 동적할당을 사용한다.
#include <stdio.h>
int main(void) {
int age[100];
return 0;
}
2. malloc
동적할당을 할 수 있게 해주는 함수는 malloc(Memory Allocation) 함수이다. 함수는 stdlib.h 헤더파일에 있다.인자로 크기(정수)를 주면 크기만큼 공간을 마련하고 포인터를 반환한다. 알아두면 좋은 상식은 일반 변수들이 저장되는 공간과 다른 Heap이라는 영역에서 공간을 할당한다는 것이다.
void *malloc(size_t __size)
아래 코드는 40Byte만큼 공간을 마련하는 코드이다. 포인터를 반환받는것이므로 int * 선언한다. 주의해야할 점은 malloc 함수의 반환 데이터 타입은 void *로 직접 형변환(Type casting)을 해주여야 한다는 점이다. 또한 동적할당을 한 공간은 free함수를 사용하여 해제해야한다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *dynamic;
dynamic = (int *)malloc(40);
free(dynamic);
return 0;
}
처음 예제인 고객 n명의 나이를 저장하는 코드는 아래와 같이 작성할 수 있다. 100명의 나이를 저장하기 위해서는 100 * 정수의 크기 만큼 공간을 마련해야 한다. int age[n]의 age도 포인터이고 *age도 포인터이니 동적할당으로 만들어진 변수도 int age[n]한것과 같이 사용할 수 있다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int num;
int *age;
scanf("%d", &num); // 입력 : 100
age = (int *)malloc(num * sizeof(int)); // 고객 수 * 정수의 크기
age[0] = 13;
free(age);
return 0;
}
3. 동적할당의 원리
아래 코드의 경우 10Byte의 동적할당 한 후 free로 메모리에 반환하고 또 10Byte의 동적할당을 하였을 때 두 주소가 같다는것을 확인 할 수 있다. 이는 동적 할당의 주소가 랜덤으로 이루어지는것이 아닌 순서대로 사용한 다는 것을 알 수 있다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *dynamic1, *dynamic2;
dynamic1 = (int *)malloc(10); // 0x600000510030
printf("%p\n", dynamic1);
free(dynamic1);
dynamic2 = (int *)malloc(11); // 0x600000510030
printf("%p\n", dynamic2);
free(dynamic2);
return 0;
}
동적할당은 인자로 들어오는 할당할 크기를 특정 크기로 분류하여 서로 다른 저장 공간을 사용한다. 만약 크기의 차이가 큰 두 동적할당 변수를 선언 하였을 때 단순히 주소가 다를 뿐만 아니라 다른 범위의 메모리 공간을 사용한다는것을 알 수 있다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *dynamic1, *dynamic2, *dynamic3;
dynamic1 = (int *)malloc(10); // 0x600002edc030
printf("%p\n", dynamic1);
dynamic2 = (int *)malloc(12); // 0x600002edc040
printf("%p\n", dynamic2);
free(dynamic2);
dynamic3 = (int *)malloc(1000); // 0x12fe04840
printf("%p\n", dynamic3);
free(dynamic3);
return 0;
}
'초보 해커를 위한 C언어와 동작 원리 > Ch2. Programming' 카테고리의 다른 글
구조체 (0) | 2025.04.23 |
---|---|
문자열 함수 (0) | 2025.04.23 |
함수 (0) | 2025.04.23 |
배열과 포인터 (2) | 2025.04.22 |
포인터 (0) | 2025.04.22 |