-> 홈으로
동적 할당 ¶
char *d;
d = (char*)malloc(sizeof(char)*100);
여기서 malloc(sizeof(char)*100);
은 메모리 상의 어느 곳에 (sizeof(char)*100)byte만큼의 공간을 할당하고 그 주소를 반환한다.
그리고 d는 char*형태이기 때문에 Casting을 해 주어서 (char*)malloc(sizeof(char)*100); 와 같은 형태가 되어야 한다.
이 것은 char d [100]와 같은 변수 선언법이다.
이 것은 char d [100]와 같은 변수 선언법이다.
char *d;
d = (char*)malloc(sizeof(char)*100);
와 같이 선언을 했더라도 d[10]와 같은 배열적 접근도 가능하다.
ex)이것으로 2차원 배열을 만들려면?
char **arrray, *d;
d = (char*)malloc(sizeof(char) * 100);
arrray = (char**)malloc(sizeof(d) * 100);
이렇게 하면 char array [100][100]와 같은 형태가 된다.
이걸 왜 쓰냐? ¶
int temp;
char *d;
scanf("d의 배열 크기를 입력해주세요.\n%d", temp);
d = (char*)malloc(sizeof(char) * temp);
와 같은 형태를 통해서 자신이 원하는 크기를 배열에 할당시킬 수 있다.
C에서는 변수 선언을 맨 위에 해야 하므로 int d[temp]와 같은 형태로 선언할 수 없다.(아무데서나 선언을 할 수 있는 C++에서도 이런 형태는 불가능하다.)
C에서는 변수 선언을 맨 위에 해야 하므로 int d[temp]와 같은 형태로 선언할 수 없다.(아무데서나 선언을 할 수 있는 C++에서도 이런 형태는 불가능하다.)
결론 : 메모리의 최적화를 위해서.
FREE 의 사용법 ¶
free(d); 를 이용해서 지금 실행중인 프로그램에 종속되어있는 sizeof(char) * temp만큼의 메모리를 OS에 다시 반환시킨다.
이 free는 가장 하위 포인터에만 사용이 가능하다. 따라서 array를 모두 free시키려면 for문을 돌려서 free(array[i])와 같이 모두 없애준 후에 free(array);를 해야 한다.
하지만 간단한 프로그램에서는 이렇게 해 줄 필요가 없다. 프로그램을 종료시키면 알아서 OS가 가져가기 때문에.
나중에 거대 프로젝트(오랜시간동안 켜 놓아야 하는 게임 같은 경우)에서는 메모리 반환을 하지 않으면 컴퓨터가 느려지고 가용메모리가 없어져서 메모리를 요청했을 때 메모리가 부족해 프로그램을 다시 껐다 켜야 하는 상황이 발생할 수 있다.