728x90
반응형
동적 메모리 할당 (Dynamic Memory Allocation)
프로그램 실행 도중 필요한 만큼 힙(heap) 영역의 메모리를 할당 받아 사용하는 방식입니다.
동적 메모리 할당시에는 malloc() 함수와 calloc() 함수가 있는데, 우선 malloc()을 먼저 보겠습니다.
1. malloc()
하나의 인자로 할당 메모리 크기를 결정하고, 메모리 할당을 해제하기 위해선 free() 함수를 사용합니다.
malloc()과 free() 함수 모두 stdlib.h 헤더 파일에 정의되어있어, 두 함수를 사용시 해당 헤더파일을 포함시켜야합니다.
아래 그림은 malloc을 사용하여 크기 3만큼의 메모리를 할당받는 예 입니다 .
동적할당을 마치 배열 처럼 사용할 수 있는데요, 아래 예시 코드를 살펴보겠습니다.
* 총 3가지의 동작을 합니다.
1. n 크기 만큼 동적할당을 받음
2. n 개 숫자를 입력
3. (1)번과 (2) 번 입력 옵션에 따라, 2번에서 입력한 숫자를 오름차순 or 내름차순으로 정렬 후 출력
- (1)번 옵션 : 오름차순, (2)번 옵션 : 내림차순
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n, option, temp;
int *arr;
printf("Input size : ");
scanf("%d", &n);
arr = (int*)malloc(sizeof(int)*n); // size n 동적 할당
printf("Input %d numbers : ", n);
for(int i = 0; i < n; i++) // n개 정수 입력
{
scanf("%d", (arr+i));
}
printf("Ascending(1) or Descending(2) : ");
scanf("%d", &option);
for(int i = 0; i < n; i++) // 오름차순 정렬(버블 정렬 사용)
{
for(int j = 0; j < n -1; j++)
{
if(*(arr+j) > *(arr+j+1))
{
temp = *(arr+j);
*(arr+j) = *(arr+j+1);
*(arr+j+1) = temp;
}
}
}
if(option == 1)
{
for(int i = 0; i < n; i++)
{
printf("%d ", *(arr+i));
}
}
else // 옵션 2입력 시, 오름 차순된 결과를 반대로 출력
{
for(int i = n ; i > 0; i--)
{
printf("%d ", *(arr+i-1));
}
}
free(arr);
arr =NULL;
return 0;
}
ex_)
- Input size : 5
- Input 5 numbers : 10 5 4 9 2
- Ascending(1) or Descending(2) : 1
≫ 2 4 5 9 2
버블 정렬로 오름차순을 하였고, 배열을 사용하는 거 처럼, 힙 메모리의 시작 주소에 +크기(+정수)를 하며 해당 주소 위치에 접근합니다.
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n -1; j++)
{
if(*(arr+j) > *(arr+j+1))
{
temp = *(arr+j);
*(arr+j) = *(arr+j+1);
*(arr+j+1) = temp;
}
}
}
내림차순의 결과는 오름차순 한 결과를 반대로 찍어낸 것과 동일하기 때문에, 내림차순 코드는 따로 작성해주지 않았습니다.
2. calloc()
두 개의 인자로 할당 메모리의 크기를 결정합니다.
- 첫 번째 인자 : 원소의 수
- 두 번째 인자 : 원소의 크기
malloc와 큰 차이가 없어서, 바로 예제 코드를 살펴보겠습니다.
#include <stdio.h>
#include <stdlib.h>
void print_Memory(int *arr, int n)
{
for(int i = 0; i < n; i++)
{
printf("arr[%d] = %d\n", i, *(arr + i));
}
}
int main(void) {
int *arr, num;
scanf("%d", &num);
arr = calloc(num, sizeof(int)); // int크기의 num개 메모리 할당
print_Memory(arr, num);
free(arr);
arr =NULL;
return 0;
}
반응형
'C Programming' 카테고리의 다른 글
C언어 2차원 배열 동적 메모리 할당 후, 두 행렬의 곱 출력 - 공부하는 도비 (0) | 2022.11.06 |
---|---|
C언어 2차원 동적 메모리 할당 - 공부하는 도비 (0) | 2022.11.06 |
C언어 레지스터 변수 - 공부하는 도비 (0) | 2022.11.06 |
C언어 전역 변수, 지역 변수, 외부 변수 - 공부하는 도비 (0) | 2022.11.06 |
C언어 피보나치 수열 출력하기 - 공부하는 도비 (0) | 2022.10.31 |