@Required
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
선언 ( Declare )
우선 주소를 할당하는 것이기 때문에 좌변에는 Pointer 타입의 변수가 필요하다. (Type은 원하는거 사용가능)
우변에는 type의 사이즈에 원하는 데이터의 개수를 곱하면 된다!
int *numptr;
numptr = malloc(sizeof(int) * N)
[ 예시 ]
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
int num1 = 20; // int형 변수 선언
int *numPtr1; // int형 포인터 선언
numPtr1 = &num1; // num1의 메모리 주소를 구하여 numPtr에 할당
int *numPtr2; // int형 포인터 선언
numPtr2 = (int*)malloc(sizeof(int)); // int의 크기 4바이트만큼 동적 메모리 할당
printf("%p\n", numPtr1); // 006BFA60: 변수 num1의 메모리 주소 출력
// 컴퓨터마다, 실행할 때마다 달라짐
printf("%p\n", numPtr2); // 009659F0: 새로 할당된 메모리의 주소 출력
// 컴퓨터마다, 실행할 때마다 달라짐
free(numPtr2); // 동적으로 할당한 메모리 해제
return 0;
}
여기서 가장 중요한 것은 반드시 메모리를 다 사용했으면 Free 해줘야 한다는 것이다.
추가적으로 malloc은 어떻게 보면 주소의 List 즉, 배열이기 때문에 Access 할 때에도 배열과 동일하게 Access할 수 있다.
Realloc
할당했던 메모리에 새로운 데이터 사이즈를 재할당할 수 있다.
arr_2 = (int*) malloc(sizeof(int)*5); // 메모리 할당, 배열의 크기만큼 할당하기 위해 5를 곱함
realloc(arr_2, sizeof(int)*10); // arr_2의 메모리를 40바이트로 재 할당
배열과 malloc
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
int **m = malloc(sizeof(int *) * 3); // 이중 포인터에 (int 포인터 크기 * 세로 크기)만큼
// 동적 메모리 할당. 배열의 세로
for (int i = 0; i < 3; i++) // 세로 크기만큼 반복
{
m[i] = malloc(sizeof(int) * 4); // (int 크기 * 가로 크기)만큼 동적 메모리 할당.
// 배열의 가로
}
m[0][0] = 1; // 세로 인덱스 0, 가로 인덱스 0인 요소에 값 할당
m[2][0] = 5; // 세로 인덱스 2, 가로 인덱스 0인 요소에 값 할당
m[2][3] = 2; // 세로 인덱스 2, 가로 인덱스 3인 요소에 값 할당
printf("%d\n", m[0][0]); // 1: 세로 인덱스 0, 가로 인덱스 0인 요소의 값 출력
printf("%d\n", m[2][0]); // 5: 세로 인덱스 2, 가로 인덱스 0인 요소의 값 출력
printf("%d\n", m[2][3]); // 2: 세로 인덱스 2, 가로 인덱스 3인 요소의 값 출력
for (int i = 0; i < 3; i++) // 세로 크기만큼 반복
{
free(m[i]); // 2차원 배열의 가로 공간 메모리 해제
}
free(m); // 2차원 배열의 세로 공간 메모리 해제
return 0;
}
'C 언어' 카테고리의 다른 글
C언어 0.09 - 문자열 배열과 포인터 배열 (0) | 2021.11.05 |
---|---|
C 언어 0.07 - bool 자료형 (0) | 2021.10.30 |
C 언어 0.05 - 포인터 ( pointer ) (0) | 2021.10.30 |
C 언어 0.04 - 배열 ( array ) (0) | 2021.10.30 |
C 언어 0.03 - 문자열 ( string ) (0) | 2021.10.27 |