int *numPtr1;
*numPtr1 = 20;
이렇게 해주면 numPtr1은 int(4바이트) 만큼 역참조로 값을 할당할 수 있던데
int *numPtr1;
numPtr1 = malloc(sizeof(int));
int(4바이트) 만큼 동적 메모리를 할당해주는 이유가 뭔가요?
요약하자면 동적 메모리를 할당하면 뭐가 어떻게 되는건지 모르겠습니다.
int *numPtr1;
*numPtr1 = 20;
int* 포인터이는 pointer to int입니다. 어딘가 int를 가리키는 곳이 필요합니다. 위 코드는 int에 해당하는 부분이 없습니다. int*은 pointer to에 해당할 뿐, int에 해당하는 부분이 없습니다. 즉, *numPtr1 = 20은 어딘가의 메모리에 값을 할당하는 것이므로 메모리를 침범하는 결과가 됩니다. 설령 컴파일이 되어도 실행하면 오류가 발생하며 종료됩니다.
Visual Studio 2015에서 프로젝트를 만들고 컴파일하면 컴파일이 되지 않습니다.
error C4700: 초기화되지 않은 'numPtr1' 지역 변수를 사용했습니다.
메모리 할당을 해줘야 pointer to int에서 int에 해당하는 부분이 메모리에 있고, 엉뚱한 메모리를 침범하지 않게 됩니다.
동적 메모리 할당을 하는 이유는 프로그램이 사용할 메모리 크기를 미리 알 수 없는 경우가 대부분이기 때문입니다. 워드 프로그램을 사용한다면 사용자가 100kb짜리 문서 파일을 열지, 1MB짜리 문서 파일을 열지 모릅니다. 문서 파일의 크기에 따라 메모리를 동적으로 할당해야 합니다.
이미지 뷰어 프로그램이라면 어떤 크기의 이미지 파일을 볼지 알 수 없으므로 메모리를 동적으로 할당합니다.
웹 브라우저라면 해당 사이트의 HTML과 이미지 크기가 얼마인지에 따라 메모리를 동적으로 할당합니다. 만약 고정 메모리라면 모든 사이트는 반드시 1MB를 넘으면 안 된다. 넘으면 웹 브라우저가 못 연다. 이런 상황이 되겠죠. 워드도 고정 메모리라면 워드 파일 1개는 1MB를 넘으면 안 됨 같은 규칙을 갖게 되겠죠.
변수를 미리 할당하고, 고정 메모리를 쓰는 경우는 실무에서는 빈도가 적습니다. 대부분은 동적 메모리 할당입니다. malloc/free는 int만큼이나 자주 씁니다.