동적할당: 두 판 사이의 차이

기술노트
(컴퓨터 과학 용어 정리 - 동적할당 추가)
 
편집 요약 없음
1번째 줄: 1번째 줄:
=== [C] 동적할당 ===
=== [C] 동적할당 ===


<br>
==== 동적할당이란? ====
 
프로그램 실행 중에 '''동적으로 메모리를 할당'''하는 것을 의미하며, '''힙(Heap) 영역'''에 메모리를 확보한다.
##### ''동적할당이란?''


> 프로그램 실행 중에 동적으로 메모리를 할당하는 것
==== 특징 ====
>
> Heap 영역에 할당한다


<br>
#include <stdlib.h> 헤더 파일이 필요하다.


* `<stdlib.h>` 헤더 파일을 include 해야한다.
동적 메모리 관리를 위한 주요 함수:


* 함수(Function)
==== 메모리 관련 함수 ====


  - 메모리 할당 함수 : malloc
'''malloc''': 메모리를 원하는 크기만큼 할당


    -  `void* malloc(size_t size)`
void* malloc(size_t size)


    - 메모리 할당은 size_t 크기만큼 할당해준다.
예: malloc(sizeof(int) * 4) → int형 변수 4개 크기만큼 할당


  - 메모리 할당 및 초기화 : calloc
'''calloc''': 메모리 할당과 동시에 0으로 초기화


    - `void* calloc(size_t nelem, sizeo_t elsize)`
void* calloc(size_t nelem, size_t elsize)
    - 첫번째 인자는 배열요소 개수, 두번째 인자는 각 배열요소 사이즈
    - 할당된 메모리를 0으로 초기화


  - 메모리 추가 할당 : realloc
첫 번째 인자: 요소 개수, 두 번째 인자: 요소 크기


    - `void'' realloc(void ''ptr, size_t size)`
'''realloc''': 기존 메모리 크기를 변경 (추가/축소)
    - 이미 할당받은 메모리에 추가로 메모리 할당 (이전 메모리 주소 없어짐)


  - 메모리 해제 함수 : free
void* realloc(void* ptr, size_t size)


    - `void free(void* ptr)`
원래 메모리의 내용을 유지하면서 크기를 변경함
    - 할당된 메모리 해제


<br>
'''free''': 동적할당된 메모리 해제


===== 중요 =====
void free(void* ptr)


할당한 메모리는 반드시 해제하자 (해제안하면 메모리 릭, 누수 발생)
==== 중요: 메모리 해제 ====
동적으로 할당된 메모리는 사용이 끝나면 반드시 '''free()'''를 사용해 해제해야 한다. 그렇지 않으면 '''메모리 누수(memory leak)'''가 발생할 수 있다.


<br>
==== 예제 코드 ====


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


int main(void) {
int main(void) {
    int arr[4] = { 4, 3, 2, 1 };
int arr[4] = { 4, 3, 2, 1 };
    int* pArr;
int* pArr;
   
 
    // 동적할당 : int 타입의 사이즈 * 4만큼 메모리를 할당
// 동적할당: int형 4개만큼 메모리 할당
    pArr = (int'')malloc(sizeof(int)''4);
pArr = (int*)malloc(sizeof(int) * 4);
   
 
    if(pArr == NULL) { // 할당할수 없는 경우
if(pArr == NULL) {
        printf("malloc error");
    printf("malloc error\n");
        exit(1);
     exit(1);
    }
   
    for(int i = 0; i < 4; ++i) {
        pArr[i] = arr[i];
    }
   
    for(int i = 0; i < 4; ++i) {
        printf("%d \n", pArr[i]);
     }
   
    // 할당 메모리 해제
    free(pArr);
   
    return 0;
}
}
</syntaxhighlight>


'' 동적할당 부분 : `pArr = (int'')malloc(sizeof(int)*4);`
for(int i = 0; i < 4; ++i) {
  - `(int'')` : malloc의 반환형이 void''이므로 형변환
    pArr[i] = arr[i];
  - `sizeof(int)` : sizeof는 괄호 안 자료형 타입을 바이트로 연산해줌
}
  - `*4` : 4를 곱한 이유는, arr[4]가 가진 동일한 크기의 메모리를 할당하기 위해
 
  - `free[pArr]` : 다 사용하면 꼭 메모리 해제
for(int i = 0; i < 4; ++i) {
    printf("%d\n", pArr[i]);
}
 
// 메모리 해제
free(pArr);
 
return 0;
 
}
 
 
==== 코드 설명 ====


<br>
(int*): malloc은 void*를 반환하므로 형변환 필요


<br>
sizeof(int): int형의 바이트 크기 (일반적으로 4바이트)


##### [참고 자료]
* 4: 배열 4개 요소의 메모리 확보


* [링크](https://blockdmask.tistory.com/290)
free(pArr): 사용 후 반드시 메모리 해제

2025년 5월 6일 (화) 07:06 판

[C] 동적할당

동적할당이란?

프로그램 실행 중에 동적으로 메모리를 할당하는 것을 의미하며, 힙(Heap) 영역에 메모리를 확보한다.

특징

  1. include <stdlib.h> 헤더 파일이 필요하다.

동적 메모리 관리를 위한 주요 함수:

메모리 관련 함수

malloc: 메모리를 원하는 크기만큼 할당

void* malloc(size_t size)

예: malloc(sizeof(int) * 4) → int형 변수 4개 크기만큼 할당

calloc: 메모리 할당과 동시에 0으로 초기화

void* calloc(size_t nelem, size_t elsize)

첫 번째 인자: 요소 개수, 두 번째 인자: 요소 크기

realloc: 기존 메모리 크기를 변경 (추가/축소)

void* realloc(void* ptr, size_t size)

원래 메모리의 내용을 유지하면서 크기를 변경함

free: 동적할당된 메모리 해제

void free(void* ptr)

중요: 메모리 해제

동적으로 할당된 메모리는 사용이 끝나면 반드시 free()를 사용해 해제해야 한다. 그렇지 않으면 메모리 누수(memory leak)가 발생할 수 있다.

예제 코드

  1. include <stdio.h>
  2. include <stdlib.h>

int main(void) { int arr[4] = { 4, 3, 2, 1 }; int* pArr;

// 동적할당: int형 4개만큼 메모리 할당 pArr = (int*)malloc(sizeof(int) * 4);

if(pArr == NULL) {

   printf("malloc error\n");
   exit(1);

}

for(int i = 0; i < 4; ++i) {

   pArr[i] = arr[i];

}

for(int i = 0; i < 4; ++i) {

   printf("%d\n", pArr[i]);

}

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

return 0;

}


코드 설명

(int*): malloc은 void*를 반환하므로 형변환 필요

sizeof(int): int형의 바이트 크기 (일반적으로 4바이트)

  • 4: 배열 4개 요소의 메모리 확보

free(pArr): 사용 후 반드시 메모리 해제