C언어) 포인터 - 동적할당

Lapis0875·2022년 10월 21일
0

c언어

목록 보기
4/21
post-thumbnail

📑포인터 시리즈

포인터 5부작 중 4부에요. 지난 3개의 글을 읽었거나, 이미 알고계신게 아니라면 이 시리즈의 지난 글들도 읽어주세요 😉

📱가변 길이의 배열?

C언어에서 배열을 만들 때, 고정된 길이로만 만들 수 있는 점이 아쉬웠던 적이 있을거에요. C언어에서는 동적 할당이라는 방법으로 원하는 크기의 메모리를 할당해, 가변 길이 배열처럼 활용할 수 있어요.

💡동적 할당

동적 할당이란, 이름 그대로 메모리를 동적으로 할당하는 방법이에요. 임의의 크기를 임의의 시점에 할당하고 해제하는 방법으로 메모리를 직접 관리할 수 있어요.

// 동적할당 관련 함수들은 stdlib.h에 정의되어 있어요.
void *calloc(size_t N, size_t el_size);

calloc은 두개의 size_t형 인자를 받아, 할당된 메모리의 주소를 void*로 반환해주는 함수에요. N은 이 메모리 공간 안에 할당할 원소의 개수이고 (배열로 따지면 길이와 같아요), el_size는 이 메모리를 다룰 자료형의 크기 (sizeof로 계산한 크기에요)에요.
calloc으로 할당한 메모리는 모두 0으로 초기화 되어있어요.

void *malloc(size_t N_bytes);

malloc은 calloc과 달리, N_bytes라는 인자 한개만 받아, 할당된 메모리의 주소를 void*로 반환해주는 함수에요. 이 인자는 할당할 메모리의 바이트 수에요. 이 메모리를 다룰 자료형의 크기와 원소의 개수의 곱으로 표현할 수 있어요.

void *free(void *ptr);

free는 malloc 또는 calloc으로 동적으로 할당한 메모리를 해제할 때 사용해요. 동적할당한 메모리는 프로그램에서 자동으로 해제되지 않기 때문에, 더 이상 사용하지 않는다면 반드시 free를 사용해 해제해 주어야 해요.

🖥️예제로 알아보기

간단하게 예제를 통해 동적 할당의 사용법을 이해해보고자 해요.

학생들의 점수 저장하기

학생들의 점수를 표준 입력으로부터 입력받아 저장하고자 해요. 단, 몇 명의 학생이 있는지는 몰라 첫 줄에 길이 N을 입력받아야 해요.

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int *scores, N;
    scanf("%d", &N);
    // 길이 N의 int형 배열을 동적으로 할당해요. calloc이나 malloc 둘 다 사용할 수 있어요.
    // 두 함수 모두 void* 형의 포인터를 반환해주니 사용하고자 하는 자료형에 맞게 형변환을 해줘야 해요.
    scores = (int*) calloc(N, sizeof(int));
    scores = (int*) malloc(N * sizeof(int));
    
    // 표준 입력으로부터 점수를 입력받아요.
    for (int i = 0; i < N; i++)
    	scanf("%d", &scores[i]);
    // 포인터이기 때문에, 이렇게도 입력받을 수 있어요!
    for (int i = 0; i < N; i++)
    {
    	scanf("%d", scores);
        scores++;
    }
    scores -= N;		// 포인터를 다시 배열의 첫 원소를 가리키게 해요.
    
    free(scores);		// 반드시 동적할당 한 메모리는 더 이상 사용하지 않을 때 해제해야 해요.
	return 0;
}

배운 내용들을 정리해보고 있어요. 잘못 기재된 내용이 있다면, 댓글로 지적해주시면 수정할게요.

profile
새내기 대학생 개발자에요 :D

0개의 댓글