1. 동적메모리 할당
- 동적 메모리 할당 : 변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당 가능
- malloc 함수를 호출하여 동적메모리 할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환한다.
int *p;
p = (int *)malloc(40);
malloc이 반환하는 주소는 타입이 없는 주소(void *)이다. 정수들을 저장하기 위해서 이것을 (int *)로 변환한다. 반드시 필요한 건 아니다.
할당받은 메모리의 크기를 byte 단위로 지정한다. 여기서는 10개의 정수를 저장하기 위해 40바이트를 요청하였다.
2. 배열 키우기
- 동적으로 할당된 배열은 공간이 부족할 경우 더 큰 배열을 할당하여 사용할 수 있다.
#include <stdlib.h>
int * array = (int * )malloc(4*sizeof(int));
array[0] = 1;
array[1] = 2;
*(array+2) = 3;
int * tmp = (int *)malloc(8*sizeof(int));
int i;
for (i=0; i<4; i++)
tmp[i] = array[i];
array = tmp;
array[4] = 4;
array[5] = 5;
좋은 코드는 아님. 이렇게 하게 되면 원래 할당 받았던 메모리 공간은 garbage. 자동처리 안됌
- 배열의 크기는 어떻게 키우냐 ? 다른 곳에 더 큰 데이터를 할당 후에 저 데이터를 옮긴다.
``` Q)// int * array = (int )malloc(4sizeof(int));와 int array[4];는 무슨 차이가 있느냐?
이 둘 사이에는 굉장한 차이.
-
array = tmp; 이렇게 할 수 없다. 왜냐하면 배열의 이름은 배열의 시작 주소를 저장하는 포인터 변수이다. 단 그 값을 변경할 수 없다. array를 포인터 변수로 선언했을 때는 수정 가능하지만, array를 배열의 이름으로 선언을 해버리면 array의 값은 수정할 수 없는 값이 된다.
-
변수의 lifetime과 관련된 이야기. 나중 수업에서 자세히 설명할 예정
참고자료