전역변수와 지역변수로 해결이 되지 않는 상황malloc은 메모리공간을 할당할 때 사용하는 함수 [잠시 변수 할당] 1. 지역변수일 경우 ReadUserName : 이름을 입력받고 입력받은 이름을 반환하는 함수 main : ReadUserName의 주소값을 반환해 출력 -> 문자열을 입력받기 위한 메모리 공간이 필요하다. 작동 순서 1. 메모리 공간 할당 2. 입력 3. 반환 -> name2의 출력이 끝났을 때 name1이 가리키는 것 : 첫번째로 입력한 문자열 name2가 가리키는 것 : 두번째로 입력한 문자열 -> ReadUserName()을 name1에 반환 -> name은 지역변수이므로 return과 동시에 소멸한다. -> name1에는 소멸된 변수를 가리킨다. [에러 : 출력은 될수도 있지만 잘못된 코드] 2. 전역변수일 경우 ReadUserName 함수 1. 전역변수 name 2. gets 3. return -> 전역변수는 고정 [삭제, 추가 불가] -> name1과 name2을 입력받으면 두 개의 메모리공간 할당해야하지만 하나의 메모리 공간을 공유한다. -> 출력을 하면 name1을 덮어써서 name1과 name2과 같아진다. 해결 방법 =>어떤 형태의 메모리 할당이 필요할까? ReadUserName이 여러번 호출될때 각각 메모리가 할당되는 방법함수가 호출되었을 때 메모리공간이 할당이 되어서 원하는 시간에 지울 수 있는 방법 : malloc() -> 프로그래머가 지우지 않는 이상 계속해서 메모리에 남아있다. 데이터 영역 : 전역 변수 힙 영역 : 프로그래머가 원하는 시점에 할당과 해제하는 변수 스택 영역 : 지역 변수
-> 포인터연산을 하기 위해서는 데이터형변환이 필요하다 *ptr1= 20을 하기위해서는
malloc 함수의 반환형이 void형 포인터인 이유
-> malloc함수는 메모리의 용도를 모르기 때문에 포인터형의 결정을 못한다. -> 형변환 과정을 통해 할당된 메모리의 주소값을 저장 힙 영역으로의 접근
-> 힙 영역으로의 접근은 포인터를 통해서만 이루어진다.
-> malloc 호출 후 반환된 주소값이 NULL이 아닌지 확인 후 메모리 공간을 사용해야 한다. 동적 할당인 이유 : 컴파일 시 할당에 필요한 메모리 공간이 계산되지 않고, 실행 시 할당에 필요한 메모리 공간이 계산되므로 동적할당 free 함수를 호출하지 않으면 : 할당된 메모리 공간은 메모리라는 중요한 리소스를 계속 차지하게 된다. -> 프로그램이 종료되면 할당된 메모리가 소멸된다. [종료시 모든 리소스는 소멸된다.] 꼭 free함수를 호출해야 하는 이유는 무엇인가? : fopen 함수와 쌍을 이루어 fclose 함수를 호출하는 것과 유사하다. malloc을 호출하면 반드시 free 호출을 해야한다.문자열 반환 함수 해결
1. 메모리 할당 -> 함수를 빠져나가도 소멸되지 않는다. 2. 입력 3. 반환 calloc & realloc-> malloc, calloc, realloc 함수 호출을 통해서 할당된 메모리 공간은 모두 free 함수호출을 통해서 해제한다. 13 Aug 2017 in Language on C 제가 책(윤성우의 열혈 C 프로그래밍)을 보다가 까먹었던 부분만 포스팅 하는 것입니다! 순서가 뒤죽박죽이어도 이해해주세요~~! C언어의 메모리 구조프로그램 실행 시 운영체제에 의해서 마련되는 메모리 구조는 다음과 같습니다.
메모리의 동적 할당전역변수와 지역변수로 해결이 되지 않는 상황을 보겠습니다. 함수를 이용해서 사용자의 이름을 저장하고 싶은 것인데요~ 첫번째는 지역변수를 사용한 경우입니다
위의 경우는 에러를 발생시키는데, 그 이유는 함수 your_name을 빠져나오면서 그 안의 선언된 지역변수들은 모두 소멸되어서 name1에는 쓰레기 값이 저장되기 때문입니다. 그렇다면 전역변수를 사용하면 문제가 해결될까요?
전역변수를 사용하면 위의 경우와 같이 여러명의 이름을 받을 때, 다른 이름을 덮어쓰는 문제가 발생합니다. 이를 해결해주는 것이 힙 영역에 할당되는 변수입니다. 힙 영역의 메모리 공간 할당과 해제는 malloc과 free함수로 할 수 있습니다.
그리고 malloc함수를 선언했으면 꼭 free함수로 동적해제를 해주어야합니다~! 그럼 아까 문제를 malloc을 써서 해결해보겠습니다.
문제가 깔끔히 해결되는 것을 보실 수 있습니다~! calloc과 realloc 함수힙 영역에 메모리 공간을 할당하는 함수로 calloc이 있습니다.
그리고 힙에 할당된 메모리 공간 확장 시에는 realloc 함수를 이용합니다~
|