반응형
C언어에서 동적 할당을 사용하는 이유는 간단하다
시간을 단축하기 위해 사용하는 것이다.
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
scanf("%d", &num);
int card[num] = { 0, };
return 0;
}
|
cs |
이렇게 num이란 숫자를 입력받았을 때 크기가 num인 배열을 만들고 싶다.
하지만 c언어에서는 이러한 배열 선언이 안돼서, 항상 입력할 수 있는 최댓값을 배열의 크기로 정하긴 했다.
그렇게 되면 입력한 값이 작아도 시간은 오래 걸리게 되는 일이 발생했다.
1. malloc
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
scanf("%d", &num);
int *card = (int*)malloc(sizeof(int)*num);
return 0;
}
|
cs |
int가 아닌 다른 자료형도 가능하다.
그림에서는 괄호 안에 sizeof(int)밖에 없지만, (sizeof(int)*숫자)를 해야 원하는 크기의 영역을 할당받을 수 있다.
malloc은 할당을 받으면 그 안에 쓰레기 값이 들어가 있다.
2. calloc
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
scanf("%d", &num);
int *card = (int*)calloc(num, sizeof(int));
return 0;
}
|
cs |
calloc은 malloc과 거의 비슷하지만 calloc은 (변수 , 자료형의 크기) 이렇게 선언을 해야한다.
ex) (num, sizeof(int)) -> num의 크기 * 4byte만큼의 크기를 할당받았다.
그리고 calloc은 할당을 하게 되면, 그 안에 0이 들어가 있다.
3. realloc
realloc은 할당받은 크기를 재조정받는다고 생각하면 쉽다.
1
2
3
4
5
6
7
8
9
10
|
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
scanf("%d", &num);
int *card = (int*)calloc(num, sizeof(int));
card = realloc(card, 100 * sizeof(int));
return 0;
}
|
cs |
위에 코드에서는 num*4 bytes의 크기만큼 크기를 할당받았었는데,
realloc 함수를 이용해 크기를 100*4 bytes으로 재조정했다.
4. free
항상 배열을 할당받으면 맨 끝부분에 free(pointer)을 해줘야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
scanf("%d", &num);
int *card = (int*)calloc(num, sizeof(int));
for (int a = 0; a < num; a++)
{
printf("%d\n", card[a]);
}
free(card);
return 0;
}
|
cs |
반응형