보통은 변수로 메모리를 할당 하지만,
그것 대신 프로그램의 요청으로 메모리를 할당 할 수 있습니다.
그것이 바로 동적 메모리 할당(Dynamic Memory Allocation) 입니다.malloc 함수를 호출하여 동적메모리 할당을 요청하면 요구하는 크기만큼의 메모리를 할당하고
그 시작 주소를 반환 합니다.
int * p;
p = (int *) malloc(40);
if (p == null) {
// 동적 메모리 할당이 실패
// 적절한 조치를 취하는 로직 생성
}
p[0] = 12;
p[1] = 24;
*(p+2) = 36;
여기서 동적메모리 할당의 주된 특징은
동적으로 할당된 배열의 공간이 부족할 경우에 더 큰 배열을 할당하여 사용이 가능합니다.
int *array = (int *) malloc(4 * sizeof(int)); // == malloc(16);
// 배열 array의 크키가 부족한 상황이 발생한다.
int *tmp = (int *) malloc(8 * sizeof(int));
int i;
for (int i = 0; i < 4; ++i) {
tmp[i] = array[i];
}
array = tmp;
그러나 이러한 방법이 반복된다면 array같은 버려지는 배열은 쌓이면서 프로그램의 속도를 저하 시킬 수 있다.
그것을 처리하는 방법은 나중에 다루겠다.
아니 위에 로직에서
int *array = (int *) malloc(4 * sizeof(int)); // 1 int array[4]; // 2
??? : 아니 그러면 1번 * array로 선언하지 말고 , 2번 array[4] 로 선언해도 상관없는거 아닌가요??
앞서 이전 포스팅 ( Pointer & Array ) 을 참고 하면!
array[4] 로 선언할 경우 같은 배열이 나오는 것은 맞다 .
하지만! array라는 배열의 주소값을 가진 포인터 변수는 변경이 불가 하다는 점이 있다.그리고 또 하나는 array[4]로 선언했을 경우
LifeTime 에 대한 Problem이 발생하게 된다. 이 또한 나중에 다루도록 하겠습니다.