83. malloc 함수

void *malloc(size_t size);

malloc 함수를 사용할 때는 입력 인자로 필요한 형식의 메모리 크기를 전달하세요.
malloc 함수는 요청한 크기의 메모리를 동적으로 할당하여 반환해줘요.
호출한 곳에서는 원하는 형식의 포인터로 형변환하여 할당받은 주소를 기억하세요.
그리고 간접 연산이나 인덱스 연산으로 할당받은 메모리에 원하는 값을 설정하거나 얻어올 수 있어요.

참고로 malloc 함수를 호출하면 메모리만 할당하며 할당한 메모리의 값을 초기화하지 않아요.
따라서 동적으로 할당받은 메모리의 초기값은 쓰레기 값(Garbage Value)이예요.
그리고 동적으로 할당받은 메모리가 더 이상 필요 없으면 free 함수를 호출하여 해제하세요.

◈ malloc 함수 호출로 동적으로 메모리 할당하여 사용하는 예

#include <stdio.h>
#include <malloc.h>
int main()
{
    int *pi = (int *)malloc(sizeof(int)); //원하는 형식 포인터로 형변환
    printf("초기: %d \n",*pi);
    *pi= 20; //간접 연산으로 사용
    printf("간접 연산을 수행한 후: %d\n",*pi);
    free(pi); //더 이상 필요없을 때 해제
    return 0;
}

◈ 실행 결과

초기: -842150451
간접 연산을 수행한 후: 20 

동적 메모리 할당을 이용하면 컴파일 시점에 메모리 크기를 결정해야 하는 배열의 한계를 극복할 수 있어요.
예를 들어 관리해야 할 학생 수를 최종 사용자가 결정한다면 컴파일 시점에 배열을 선언하는 것은 한계가 있겠죠.
물론 동적으로 메모리를 할당받아 사용할 때도 할당한 메모리를 벗어나지 않게 주의해서 사용하세요.

◈ 학생 수를 입력 받아 동적으로 메모리를 할당받아 사용하는 예

#include <stdio.h>
#include <stdlib.h>
  
void InputScores(int *base,int asize); //asize 명의 성적을 입력받는 함수
void ViewScores(int *base,int asize); //asize 명의 성적을 출력하는 함수
int InputScore(int num); //num 번의 학생 성적을 입력받는 함수
int main()
{
    int *base = 0;  //동적으로 할당받아 학생들의 성적을 관리할 메모리의 시작 주소
    int max_stu= 0;   //관리할 학생 수
    printf("최대 관리할 학생 수를 입력하세요.\n");
    scanf_s("%d",&max_stu);
    base = (int *)malloc(sizeof(int) * max_stu); //성적을 보관할 메모리를 할당
    InputScores(base,max_stu); //학생들의 성적 입력 요청
    ViewScores(base,max_stu); //학생들의 성적 출력
    free(base); //동적으로 할당한 메모리 해제
    return 0;
}
  
void InputScores(int *base,int asize)
{
    int i = 0;
    for(i = 0;  i<asize; i++)
    {
        base[i] = InputScore(i+1); //i+1 번의 학생 성적을 입력받아 base[i]에 대입
    }
}
void ViewScores(int *base,int asize)
{
    int i = 0;
    for(i = 0;  i<asize; i++)
    {
        printf("%d 번: %d \n",i+1, base[i]); //i+1 번의 성적 출력
    }
}
int InputScore(int num)
{
    int score;
    printf("%d 번의 성적을 입력하세요.\n",num);
    scanf_s("%d",&score);
    return   score;
}