컴퓨터/C
malloc 함수는 Memory allocation의 줄임말입니다.
malloc 함수를 이용해서 동적 메모리 할당을 하게 되면 힙 역영에 메모리를 할당받게 됩니다.
동적 메모리 할당을 하게 되면 정적 메모리 할당을 최소화하여 프로그램의 몸집을 간소화할 수 있고, 프로그램의 크기를 좀 더 자유롭게 제어할 수 있게 됩니다.
본문에서는 malloc 함수를 이용하여 동적할당 해보고 , 사용이 끝난 동적 할당된 메모리를 free함수를 이용해서 제거해보도록 하겠습니다.
malloc 함수는 stdlib.h에 들어있고 원형은 아래와 같습니다.
<stdlib.h>
void *malloc(unsigned int);
malloc 함수의 짝꿍 같은 존재로 C언어에서는 반듯이 동적 할당된 메모리 사용이 끝나면 free함수로 할당을 해제해야 된다.
<stdlib.h>
void free(void* ptr);
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* num; // 포인터 변수생성 (스택영역)
num = malloc(sizeof(int)); // 스택영역에 생성된 포인터 변수에 동적메모리를 할당
if (num == NULL)
{
printf("동적 메모리 할당에 실패했습니다.\n");
}
else
{
printf("%p\n", num); //할당된 동적 메모리 주소 확인
*num = 10; ////동적 메모리 주소 안에 값 입력
printf("%d", *num); //동적 메모리 주소 안의 값 출력
}
free(num); //사용이 끝난 동적 메모리 할당 해제
return 0;
}
위의 소스코드와 결과를 보면 포인터 변수에 다른 변수의 주소 값이 아닌 동적 메모리 할당을 통해 힙 영역의 메모리 주소를 넣어온 것입니다. 컴퓨터 상에서 보면 다음과 같습니다.
위의 내용을 다시 한번 정리해보면 아래와 같습니다.
위의 정리한 동적메모리와 이전에 공부한 포인터 주소 연산의 개념을 적용하면 프로그램 안에서 배열의 크기를 정할 수 있게 됩니다.
기존 배열 소스코드
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
int size;
printf("원하는 배열의 크기를 정하세요 : ");
scanf("%d", &size);
int arr[size] = { 0, }; // error 발생 정적할당은 프로그램이 만들어질때 정해지기 때문에 불가능.
int arr[10] = { 0, }; // 이런식으로 초기에 값이 확정되어 있어야 한다.
return 0;
}
동적메모리 할당 응용을 한 자유로운 크기의 배열
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
int size;
printf("원하는 배열의 크기를 정하세요 : ");
scanf("%d", &size);
int* parr = malloc(sizeof(int) * size); // 동적 메모리 할당 입력받은 사이즈 * int 크기만큼
// 이 할당받은 메모리 시작 주소를 포인터에 대입
if (parr == NULL)
{
printf("동적 메모리 할당 실패 !\n");
}
else
{
for (int i = 0; i < size; i++)
{
*(parr + i) = i; // int크기만큼 주소연산을 하며 동적메모리에 int크기만큼에 값 넣기
}
for (int i = 0; i < size; i++)
{
printf("%d\n", *(parr + i)); // 동적 메모리에 저장된 값 출력
}
}
free(parr); // 사용 완료한 동적메모리 할당 해제
return 0;
}
위의 소스코드처럼 동적 메모리 할당을 사용한다면 프로그램이 진행 중에도 메모리의 할당이 가능해지기 때문에 다양한 조금 더 유연한 프로그램을 만들 수 있게 됩니다.
C 언어 - void 키워드 (0) | 2021.07.10 |
---|---|
C 언어 - 문자열을 숫자로 atoi / atol / atoll / atof (0) | 2021.07.08 |
C 언어 - 동적메모리의 개념 (0) | 2021.07.02 |
C 언어 - 쓰래기값과 초기화 (0) | 2021.06.30 |
C 언어 - 열거체(enum) (0) | 2021.06.30 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet