1. 메모리할당
우리가 흔히쓰는 선언은 정적 선언이라고 합니다.
즉, 메모리의 총량이 정해져 있다는 것입니다.
정적 선언으로 인해 지정된 변수는 Stack 이라는 메모리공간에 저장됩니다.
※ 참고 : 블럭이 시작 될 때도 stack 에 메모리를 할당합니다.
이를 전문용어로 Activation Recorde라고 합니다.
이에 비해 아래에 나올 동적 선언으로 인해 지정된 변수는
Heap 이라는 메모리에 저장됩니다.
그럼 이젠 동적 할당을 알아봅시다.
2. 동적 할당
동적 할당은 말 그대로 용량이 정해져 있지 않고 변화하는 것을 이야기 합니다.
동적 할당은 다음의 경우에 사용합니다.
1) 필요한 크기를 미리 알수 없는 경우
2) 실제로 필요성 여부를 모르는 메모리를 부여할 때
3) stack size에 한계가 있으므로
이 3가지의 이유에 해당될 때 동적 할당을 사용하게 됩니다.
동적 할당 명령어로는 malloc(), calloc(), realloc() 이 있습니다.
그리고 헤더 파일(#include)로 stdlib.h 를 첨부해주어야 됩니다.
또한, 동적 할당은 Heap메모리에 랜덤으로 부여 되므로 포인터처럼 주소를 이용하여
조작을 해야 됩니다. 이에 따라 동적 할당할 변수는 포인터로 지정해줍니다.
3. malloc()
흔히 엠알록 또는 멀록이라고 하는 명령어로 가장 많이 사용되는 동적 할당 선언서 입니다.
int *ip;
char *c;
ip = (int *)malloc(sizeof(int)) ;
c = (char *)malloc(strlen("hello")+1);
변수이름 = (형식 *)malloc(크기)
이런 형식의 문법을 가지고 있습니다.
포인터형식의 변수를 선언해주고, 그 변수에 동적할당을 하는 것입니다.
위의 예는 인티져크기로 할당된 ip와 hello를 넣을 만큼의 크기가 되는 c를 동적 할당으로
만들어 낸 것입니다. c = (char *)malloc(strlen("hello")+1)에서 +1은 꼭 지켜 주십시요.
Null(\0)가 들어갈 자리 입니다.
malloc의 설명이 끝나면 이제부턴 쉽게 설명할수 있겟내요-_-;; 오랜만에 쓰니;;
4. calloc()
calloc은 동적 할당의 크기뿐만아니라 그것을 만들어낼 개수를 지정해줄수 있습니다.
int *ip;
ip = (int *)calloc(5,sizeof(int));
변수이름 = (형식 *)calloc(개수,크기)
이런 형식의 문법을 가지고 있습니다.
malloc과 똑같이 포인터형식의 변수를 선언해주고, 그 변수에 동적할당을 하는 것입니다.
특징은 그 개수를 지정하여 배열처럼 사용이 가능한 것입니다.
위의 예는 인티져크기로 할당된 ip를 5개 복제하는 것입니다.
5. realloc()
realloc은 동적 할당된 것을 다시 할당하는 것입니다.
int *ip;
ip = (int *)malloc(sizeof(int));
ip = realloc(ip,sizeof(int)*2);
변수이름 = realloc( 없엘 변수, 크기)
이런 형식의 문법을 가지고 있습니다.
위의 예를 들어 설명하면 인티져크기로 선언된 ip를 free시켜 ip에 인티져크기의 두배가
되는 메모리를 할당 하는 것입니다.
free는 아래에서 설명 하도록 하겠습니다.
만약 없엘 변수가 없다면, malloc과 똑같은 역할을 하고,
크기가 없다면, free와 같은 역할을 합니다.
6. free()
int *ip;
ip = (int *)malloc(sizeof(int));
free(ip);
free(변수이름)
동적 할당된 메모리는 프로그램에서 다시 지정하지 않는 이상
프로그램이 끝날 때까지 남아있습니다.
쓸 때없이 할당된 메모리가 늘어나면 프로그램이 느려지며, 일명 랙!! 이 걸립니다.
이를 메모리가 센다고 흔히들 말합니다.
이를 방지하기 위해서는 free를 사용하여 할당된 메모리를 놓아주면됩니다.
위의 예는 ip에 인티져크기만큼 동적할당을 하고 난 뒤에 ip를 free를 이용하여
ip가 가지고 있던 메모리를 놓아주는 것입니다.
우리가 흔히쓰는 선언은 정적 선언이라고 합니다.
즉, 메모리의 총량이 정해져 있다는 것입니다.
정적 선언으로 인해 지정된 변수는 Stack 이라는 메모리공간에 저장됩니다.
※ 참고 : 블럭이 시작 될 때도 stack 에 메모리를 할당합니다.
이를 전문용어로 Activation Recorde라고 합니다.
이에 비해 아래에 나올 동적 선언으로 인해 지정된 변수는
Heap 이라는 메모리에 저장됩니다.
그럼 이젠 동적 할당을 알아봅시다.
2. 동적 할당
동적 할당은 말 그대로 용량이 정해져 있지 않고 변화하는 것을 이야기 합니다.
동적 할당은 다음의 경우에 사용합니다.
1) 필요한 크기를 미리 알수 없는 경우
2) 실제로 필요성 여부를 모르는 메모리를 부여할 때
3) stack size에 한계가 있으므로
이 3가지의 이유에 해당될 때 동적 할당을 사용하게 됩니다.
동적 할당 명령어로는 malloc(), calloc(), realloc() 이 있습니다.
그리고 헤더 파일(#include)로 stdlib.h 를 첨부해주어야 됩니다.
또한, 동적 할당은 Heap메모리에 랜덤으로 부여 되므로 포인터처럼 주소를 이용하여
조작을 해야 됩니다. 이에 따라 동적 할당할 변수는 포인터로 지정해줍니다.
3. malloc()
흔히 엠알록 또는 멀록이라고 하는 명령어로 가장 많이 사용되는 동적 할당 선언서 입니다.
int *ip;
char *c;
ip = (int *)malloc(sizeof(int)) ;
c = (char *)malloc(strlen("hello")+1);
변수이름 = (형식 *)malloc(크기)
이런 형식의 문법을 가지고 있습니다.
포인터형식의 변수를 선언해주고, 그 변수에 동적할당을 하는 것입니다.
위의 예는 인티져크기로 할당된 ip와 hello를 넣을 만큼의 크기가 되는 c를 동적 할당으로
만들어 낸 것입니다. c = (char *)malloc(strlen("hello")+1)에서 +1은 꼭 지켜 주십시요.
Null(\0)가 들어갈 자리 입니다.
4. calloc()
calloc은 동적 할당의 크기뿐만아니라 그것을 만들어낼 개수를 지정해줄수 있습니다.
int *ip;
ip = (int *)calloc(5,sizeof(int));
변수이름 = (형식 *)calloc(개수,크기)
이런 형식의 문법을 가지고 있습니다.
malloc과 똑같이 포인터형식의 변수를 선언해주고, 그 변수에 동적할당을 하는 것입니다.
특징은 그 개수를 지정하여 배열처럼 사용이 가능한 것입니다.
위의 예는 인티져크기로 할당된 ip를 5개 복제하는 것입니다.
5. realloc()
realloc은 동적 할당된 것을 다시 할당하는 것입니다.
int *ip;
ip = (int *)malloc(sizeof(int));
ip = realloc(ip,sizeof(int)*2);
변수이름 = realloc( 없엘 변수, 크기)
이런 형식의 문법을 가지고 있습니다.
위의 예를 들어 설명하면 인티져크기로 선언된 ip를 free시켜 ip에 인티져크기의 두배가
되는 메모리를 할당 하는 것입니다.
free는 아래에서 설명 하도록 하겠습니다.
만약 없엘 변수가 없다면, malloc과 똑같은 역할을 하고,
크기가 없다면, free와 같은 역할을 합니다.
6. free()
int *ip;
ip = (int *)malloc(sizeof(int));
free(ip);
free(변수이름)
동적 할당된 메모리는 프로그램에서 다시 지정하지 않는 이상
프로그램이 끝날 때까지 남아있습니다.
쓸 때없이 할당된 메모리가 늘어나면 프로그램이 느려지며, 일명 랙!! 이 걸립니다.
이를 메모리가 센다고 흔히들 말합니다.
이를 방지하기 위해서는 free를 사용하여 할당된 메모리를 놓아주면됩니다.
위의 예는 ip에 인티져크기만큼 동적할당을 하고 난 뒤에 ip를 free를 이용하여
ip가 가지고 있던 메모리를 놓아주는 것입니다.