동적 메모리

Dynamic Mermory

동적메모리는 프로그램 실행중 할당받을 수 있는 메모리 공간입니다.

일반적인 정적 방식과 다르게, 배열의 길이를 코드로 제어할 수 있습니다.


malloc

int *p = (int *)malloc(sizeof(int));

동적 메모리를 선언하는 코드입니다.

포인터 변수를 선언하고, 원하는 메모리의 크기만큼 메모리를 할당하는 구조입니다.

malloc

함수의 매게변수로 할당할 메모리의 크기를 넣습니다.


형변환(casting)에 관하여

예시 코드에서는 형변환을 적용하였지만, 사실 필수적으로 작성할 필요는 없습니다.

의도에 맞추어 코드를 잘 작성하였다면, 컴퓨터가 알아서 형변환을 진행합니다.


하지만, 컴퓨터는 코드 작성자의 의도를 완전하게는 파악하지 못하고, 에러를 발생시킬 수 있습니다.

때문에, 안정적인 코드 작성을 위하여는 형변환이 권장되고 있습니다.


sizeof() 함수

int value = 10;

int size = sizeof(value);

매개변수로 들어오는 데이터 타입, 변수의 크기를 반환해주는 함수입니다.

byte 단위로 반환하기 때문에, 위 코드에서 size변수에는 4가 저장됩니다.


int *p = (int *)malloc(sizeof(int));

sizeof 함수에 대하여 설명하였으니, 이제는 위 코드가 이해되실 겁니다.

포인터 변수 pint데이터 타입의 사이즈만큼 메모리를 할당하여 주는 것이죠.


free()

int *p = (int *)malloc(sizeof(int) * 10); 

free(p); // 메모리 해제    

할당되었던 메모리 공간을 헤제하는 함수입니다.

메모리를 헤제시키지 않으면, 낭비되는 데이터 공간이 많아져서 컴퓨터가 느려지게 됩니다.

이 현상을 메모리 누수라고 합니다.


메모리 누수를 방지하기 위해서는 사용이 끝난 변수는 메모리를 헤제하여 메모리 누수를 방지할 수 있습니다.

만약 헤제된 변수로 접근할 경우엔 에러가 발생할 수 있기 때문에, 주의해야 합니다.


활용

int *p = (int *)malloc(sizeof(int) * 10); 

포인터 글에서 설명했듯, 배열과 포인터는 거의 동일합니다.

그렇기 때문에, 포인터를 배열과 같이 사용할 수 있다 설명했었죠.

배열을 포인터로 활용하는 방식이 동적 메모리를 할당하는 방식입니다.


int arr[num] //error

int *arr = (int *)malloc(sizeof(int) * num); 

전에 설명했듯, 배열을 선언하는 과정에서 배열의 크기는 동적으로 변경할 수 없습니다.

배열을 선언할 때, 길이를 변수로 활용할 수 없다는 뜻이죠.

하지만, 동적 메모리 할당방식으로는 활용할 수 있습니다.


int *func(){
    int *p = (int *)malloc(sizeof(int));
    return p;
}

함수를 활용한 방식으로도 데이터를 할당할 수 있습니다.



💡 지적 환영합니다

Comments