동적할당?
C언어에서 동적할당하는 영역이 따로 있다. = Heap 영역
이부분은 사용자가 할당하는 메모리영역이라서 할당과 해제를 사용자가 해줘야된다.
ex) int *a = (int*)malloc(sizeof(int)*length);, 한 후에는 free(a) 를 필수로 해야된다.
하지 않을 경우, 작은 프로그램의 경우는 영향이 덜하지만, 동적할당으로 힙영역에 많이 할당하게 되는 프로그램의 경우는 뒤에 가서는 메모리 할당 영역이 부족하게 되어 프로그램이 멈추는 상황이 생긴다.
그 것이 아니더라도 free 하지않으면 코드를 돌리는 데 원치 않는 값이 나오는 경우도 생긴다 ( 이유는 모르겠다. 경험상..)
왜?
이건 그냥 경험상인데 시스템 프로그래밍 할 때 많이 쓰이게 되는 것같다.
int a[1000000],b[100000],c[10000] 과 같이 큰 영역에 메모리 '정적'할당을 여러번하고 배열에서 원하는 값을 출력하는 실습이 있었는데, 계속 이상한 값이 출력되는 상황이 있었다. 그런데 코드 바꾸지않고, 저 변수들만 다 동적할당하여 실행을 하니 값이 제대로 출력되는 게 어이가 없었다. 정적 할당과 동적할당의 차이라고 짐작하고 있을 뿐이다..
어플리케이션만들거나 코딩대회에서는 동적할당을 쓸 일이 전혀없다고 한다.
사용법
1차원 배열의 경우 (길이 length)
malloc - heap 영역에 공간 할당
int *a = (int*)malloc(sizeof(int)*length);
calloc 할당된 공간의 값을 모두 0으로 초기화한다.
int *a = (int*)calloc(length, sizeof(int));
realloc - 이미 할당된 공간의 크기 변경
int *a = (int*)malloc(sizeof(int)*length); 로 되어있는 할당 영역을
realloc(a,sizeof(int)*100); - a의 메모리를 100*4 바이트 재 할당
2차원 배열의 경우 (m x n)
추후 의문점
1. free 하지 않으면 원치 않는 값이 나오는 경우, 그 이유
2. '왜?' 에서 나오는 정적 할당과 동적할당의 차이
'프로그래밍 > C,C++' 카테고리의 다른 글
[C] scanf 공백포함 입력받기( '\n' 까지 받기) (0) | 2020.02.04 |
---|---|
배열 scanf 로 입력받기 (0) | 2019.05.18 |