[C언어-막코딩] 19장 포인트 변수 메모리 할당과 해제
kr-dev·@codingman·
0.000 HBD[C언어-막코딩] 19장 포인트 변수 메모리 할당과 해제
# [C언어-막코딩] 19장 포인트 변수 메모리 할당과 해제 ----- - 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/ - 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php ----- 오늘은 포인트 변수의 메모리 할당(malloc)과 해제(free)에 대해서 이야기를 할까 합니다. 포인트를 쓰는 목적이 바로 메모리를 할당했다가 해제함으로서 메모리를 관리함으로써 메모리 낭비를 줄이는 데 있습니다. 메모리를 많이 사용하다 보면 컴퓨터는 그 만큼 메모리를 사용하는 공간이 줄어 들고 사용 공간이 줄어 든다는 것은 그 만큼 컴퓨터가 느려지게 됩니다. 컴퓨터 게임을 해보신분들은 아마 아실거에요. 어느순간 메모리 사용량이 늘어서 컴퓨터가 버벅이는 현상을 다들 느꼈을 거라 생각합니다. 아무튼 포인트를 사용하여 할당과 해제를 통해 메모리를 효율적으로 관리 할 수 있는데 그 메모리 할당과 해제를 알아보고자 합니다. ## 1. 메모리 할당과 해제 ----- - 참고 : 위키백과사전 https://ko.wikipedia.org/wiki/Stdlib.h ----- 위 위키백과사전에 가면 다양한 함수들이 있는데 아래와 같이 메모리 할당과 해제 함수들의 개념을 잘 정의해 놨네요. <center>  출처 : https://ko.wikipedia.org/wiki/Stdlib.h </center> ``` #include <stdlib.h> ``` 위 헤더파일에 제공되는 함수를 이용하는데 할당은 malloc()함수이고 해제는 free()함수입니다. 이 두 함수를 이용하여 메모리를 할당 했다 다시 해제 시킬 수 있는데 이 두함수만 개념을 잘 잡아 주세요. calloc()함수도 할당 함수이고 realloc()함수는 재할당 함수인데 우선 두개 malloc(), free()함수만 개념을 잡아 놓으시면 됩니다. ## 2. 할당 malloc() 함수와 해제 free() 함수 ----- 예) ``` include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int *p = (int*)malloc(sizeof(int)); *p=30; printf("주소 *p=%x, 값 *p=%d \n",p,*p); free(p); return 0; } ``` 할당은 포인트 p에 int형으로 크기는 sizeof(int)의 사이즈로 만든다고 했을 때 아래와 같이 표현 합니다. ``` int *p = (int*)malloc(sizeof(int)); ``` 그럼 문자형일때는 이렇게 하겠죠. ``` char *p = (char*)malloc(sizeof(char)); ``` malloc()함수로 포인트 p변수의 자료형과 크기를 지정하여 변수(그릇)를 생성하게 됩니다. 이렇게 해놓으면 \*p에 직접 값을 집어 넣을 수 있습니다. ``` *p=30; ``` 이렇게 말이죠. 이전 시간에 포인트 변수를 선언할 때에 포인트 변수가 실제 메모리 주소를 갖고 있지 않기 때문에 직접 값을 넣을 수 없고 에러가 발생 했지만 이렇게 malloc()함수로 선언하면 실제 메모리 주소를 생성하기 때문에 바로 값을 집어 넣을 수 있게 되는 것이죠. 에러의 경우는 다음과 같습니다. ``` int *p; *p=30; ``` 아래와 같이 일반 변수를 선언했을 때 일반 변수 주소지를 포인트 p가 받게 되면 해당 포인트 p에 값을 집어 넣어 지난 시간에 포인트 변수를 사용 했었죠. 아래와 같이 말이죠. ``` int a; int *p; p=&a; *p=30; ``` 이럴 필요가 없지 직접 포인트 변수를 할당 함수로 선언하게 되면 포인트 변수는 자체 새로운 주소지를 갖고 그 곳에 값을 넣을 수 있게 합니다. ``` int *p = (int*)malloc(sizeof(int)); ``` 그리 어렵지 않죠. 이제는 이 포인트 p변수를 해제하는 함수는 바로 free()함수 입니다. **free(변수이름)** 할당 함수에 비해 해제함수는 코딩 표현이 어렵지 않죠. 해당 포인트 변수 네임을 함수 인자로 넣으면 됩니다. 참고로 주소를 인자로 넘겨주어야 합니다. ``` free(p); ``` 이렇게 말이죠. \*p로 인자를 넘겨주면 안됩니다. 그럼 결과를 봅시다. **[결과]**  그런데 해제했을 때 포인트 p 상태를 알아 봐야 겠죠. **[소스]** ``` #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int *p = (int*)malloc(sizeof(int)); int i; int *arr_p; arr_p = (int*)malloc(sizeof(int)*3); *p=30; printf("주소 *p=%x, 값 *p=%d \n",p,*p); free(p); printf("주소 *p=%x, 값 *p=%d \n",p,*p); return 0; } ``` **[결과]**  보면 p의 주소지는 아직 그대로 남아 있는데 \*p의 값을 보시면 쓰래기 값을 가지고 있습니다. 이전 포인트 p가 가리키는 곳에 담아놓은 값이 사라져 버린 것이죠. 여러번 실행하다 보면 \*p 값이 30이라는 갖는 갖고 있는 상태로 있기도 하더군요. 암튼 해제함으로서 해당 주소지는 사실상 free한 상태가 되고 p변수의 소유권이 없어지기에 다른 프로그램에서 접근하면 사실 기존 주소지의 들어 있는 값은 사라지게 되겠죠. 그래서 그런지 30이란 값이 잔재해 있거나 또는 쓰래기 값으로 출력 되는데 대개 쓰래기 값으로 나오더군요. 위에 링크한 웹컴파일러도 돌리시면 값은 0으로 나옵니다. 암튼 개념은 할당이 해제되고 기존 값이 사라진다고 생각하시면 됩니다. ## 마무리 ----- 메모리 할당과 해제에 대해서 간단히 살펴 보았습니다. 메모리 할당 malloc()함수는 변수 선언할 때 선언 된 변수의 자료형과 크기에 맞게 주소지를 세팅한다고 개념을 잡으십시오. 메모리 해제 free()함수는 할당한 주소지가 해제 된다고 생각하시면 됩니다. 쉽게 말해서 메모리 할당은 변수의 생성이고 메모리 해제는 변수의 소멸로 개념을 잡으시면 됩니다. 추가로 할당 calloc()함수과 재할당realloc()함수가 있는데 이 경우는 배열 포인트 개념으로 접근해야 하는 함수이기 때문에 오늘은 여기서 멈춥니다. --- ##### <sub> **Sponsored ( Powered by [dclick](https://www.dclick.io) )** </sub> [](https://api.dclick.io/v1/c?x=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjIjoiY29kaW5nbWFuIiwicyI6ImMtMTktLTE1NTUzNzMyNDU5OTgiLCJhIjpbImktMzU0Il0sInVybCI6Imh0dHBzOi8vd3d3MS5wcmVzaWRlbnQuZ28ua3IvcGV0aXRpb25zLzU3NzY5NyIsImlhdCI6MTU1NTQ1OTgwOSwiZXhwIjoxODcwODE5ODA5fQ.fSXLVhLEwPXgvcNYKhUD_GBTnxEct3kJWgL0NPP4_Sk)
👍 codingman, urobotics, sergino, merlin7, bluesniper, anpigon, bramd, glory7, dorian-lee, busy.pay, seapy, rayboma, mishana, guest123, sisilafamille, krfeed, babymir, bullionstackers, good21, skan, sintai, happyberrysboy, wuwurrll, pill.atmos, ayogom, dj-on-steem,