파일 이름을 꺽쇠괄호(<>)대신 큰따옴표로 둘러싸는 것은, 컴파일러에게 그 파일을 표준 헤더파일을 찾는 위치가 지역에서 찾으라고 지시한다. "지역에서 찾는다"의 해석은 그 헤더파일을 소스코드 파일이 있는 디렉토리나 폴더에서, 또는 프로젝트 파일(컴파일러가 이것을 사용한다면)이 있는 디렉토리나 폴더에서 찾으라는 것이다.
C는 프로그램을 실행할 때 사용자가 메모리를 할당할 수 있다. 이 작업을 위해 사용하는 주요도구가 malloc()함수이다. malloc() 함수는 하나의 전달인자로 원하는 만큼의 메모리 바이트 수를 사용한다. 그러면 malloc()은 자유 메모리 공간에서 적당한 블록을 찾는다.
malloc()은 메모리를 할당하지만 거기에 이름을 붙이지 않는다. 그러나 그 블록의 첫번째 바이트의 주소를 리턴한다. 그러므로 어떤 포인터 변수에 그 주소를 대입할 수 있다. 그 포인터를 사용하여 그 메모리에 접근 할 수 있다.
malloc()함수는 배열, 구조체, 기타 등등을 가리키는 포인터를 리턴할 수 있다. 이란적으로 그 리턴값은 데이터형 캐스트를 사용하여 적당한 값으로 변환된다.
malloc()은 적당한 메모리 공간을 찾지 못하면 널 포인터를 리턴한다.
배열 생성 3가지 방법
1. 배열 크기를 지정하는 상수 표현식을 사용하여 배열을 선언하고, 배열 이름을 사용하여 각 원소에 접근한다.
2. 배열 크기를 지정하는 변수 표현식을 사용하여 가변길이 배열을 선언하고, 배열 이름을 사용하여 각 원소에 접근한다. 이 기능은 자동 메모리 일때만 가능하다.
3. 포인터를 선언하고, malloc()을 호출하고, 포인터에 리턴값을 지정하며, 그 포인터를 사용하여 각 원소에 접근한다. 포인터는 정적일 수도 있고 자동일 수도 있다.
일반적으로 malloc()은 free()와 함께 사용해야한다. free()함수는 바로전에 malloc()이 리턴했던 주소를 전달인자로 사용하여, 할당했던 메모리를 해제한다. 그래서, 할당된 메모리의 수명은 malloc()이 호출되어 메모리가 할당된 시점부터 free()가 호출되어 재사용 할 수 있도록 메모리를 해제하는 시점까지다.
malloc()과 free()가 메모리 풀을 관리한다고 생각해라. malloc()을 호출 할 때마다 프로그램이 사용할 메모리가 할당되고, free()가 호출될 때 마다 재사용할 수 있도록 메모리가 풀에 반납된다. free()가 사용하는 전달인자는 malloc에 의해 할당된 메모리 블록을 가리키는 포인터여야 한다.
배열 선언과 같은, 다른 방법으로 할당된 메모리를 해제하기 위해 free()를 사용할 수 없다. malloc()과 free()는 둘다 stdlib.h 헤더파일에 프로토타입이 들어있다.
free()함수는 malloc()이 할당한 메모리를 해제한다. free()함수는 자신의 전달 인자가 가리키는 메모리 블록만을 해제한다.
동적 할당 배열을 사용하면 프로그램이 상황에 맞게 크기를 조절할 수 있다.
정적 메모리양은 컴파일 될 때 고정된다. 그것은 프로그램이 실행 되는 동안 변하지 않는다. 자동 변수에 의해 사용되는 메모리양은, 프로그램이 자동으로 커졌다 작아졌다 한다. 그러나 할당된 메모리에 의해 사용되는 메모리 양은, 사용자가 free()를 사용하는 것을 잊으면 계속 커진다.
메모리를 할당하는 또한가지 방법은 calloc()을 사용하는 것이다. malloc()과 마찬가지로, calloc()도 void형을 가리키는 포인터를 리턴한다. 다른 데이터형을 저장하기를 원한다면 캐스트 연산자를 사용해야한다.
calloc()함수는 두개의 전달인자를 사용한다. 그들은 둘다 부호없는 정수값이어야한다. 첫번째 전달인자는 사용자가 원하는 메모리셀의 개수이다. 두번째 전달인잔느 각 셀의 바이트 수이다.
ex) long * newmam;
newmem = (long *)calloc(100,sizeof(long));
calloc()함수는 한가지 특징이 더있다. 이 함수는 할당된 블록의 모든 비트들을 0으로 설정한다. free()함수는 calloc()에 의해 할당된 메모리를 해제하는데에도 사용할 수 있다.
가변길이 배열(VLA)는 자동저장 클래스이다. 자동저장 클래스 이기 때문에, 실행이 VLA정의 블록을 탈출할 때 VLA가 사용하는 메모리 공간은 자동으로 해제된다.
외부연계, 내부연계, 무연계 정적변수를 위한 메모리영역, 자동변수를 위한 메모리영역, 동적으로 할당되는 메모리 영역 이렇게 세가지 영역으로 사용가능한 메모리를 프로그램이 나눈다고 생각할 수 있다.
정적 수명 저장 클래스들에 필요한 메모리양은 컴파일 될 때 결정된다. 그리고 이영역에 저장되는 데이터는 프로그램이 실행되는 동안 계속 사용할 수 있다. 이 저장 클래스에 속하는 변수는, 프로그램이 시작될 때 생성되고 프로그램이 종료될 때 소멸한다.
자동변수는, 프로그램이 그 변수의 정의를 포함하고 있는 코드 블록에 진입할 때 생성되고, 프로그램이 그 코드 블록을 탈출할 때 소멸된다. 그러므로 프로그램이 함수들을 호출 할 때 그리고 함수들이 종료될 때, 자동 변수들이 사용하는 메모리양은 커졌다 작아졌다 한다. 일반적으로 이 메모리 영역은 스택으로 처리된다. 이것은 새로운 변수들이 생성되는 순서대로 메모리에 추가되고, 소멸 될때는 반대순서로 소멸된다는 것을 의미한다. FILO
보통 프로그램은 정적 객체들, 자동 객체들, 동적으로 할당된 객체들을 위한 메모리 영역을 서로 다르게 사용한다.
문자열 리터럴을 포함하는 정적 데이터는 한 영역을, 자동 데이터는 두번째 영역을, 동적으로 할당된 데이터는 세번째 영역을(메모리 힙, 프리스토어 라고 불린다.) 차지하고 있다.
'Programming > C' 카테고리의 다른 글
rand, srand 코드 (0) | 2019.06.01 |
---|---|
C언어 공부 24 (0) | 2019.05.31 |
C언어 공부 22 (0) | 2019.05.31 |
C언어 공부 21 (0) | 2019.05.30 |
C언어 오목 만들기 (0) | 2019.05.29 |