Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 메모리구조
- R
- 윤성우 열혈자료구조
- Graph
- 알기쉬운 알고리즘
- coding test
- 혼자 공부하는 C언어
- list 컬렉션
- C programming
- Selection Sorting
- insertion sort
- buffer
- Algorithm
- s
- 윤성우의 열혈 자료구조
- datastructure
- Serialization
- stream
- 이것이 자바다
- Stack
- JSON
- 이스케이프 문자
- C 언어 코딩 도장
Archives
- Today
- Total
Engineering Note
[C] 16 -1 동적할당함수 본문
동적 할당함수
- 프로그램에 필요한 메모리 저장 공간은 프로그램을 작성 할 때 변수나 배열 선언을 통해 확보하지만 언제나 시작부터 변수나 배열 선언을 해서 저장 공간을 확보 할 수 있는 건 아닙니다. 때로는 프로그램 실행 중에 저장 공간을 할당할 수도 있습니다. 이렇게 사용한 저장 공간은 다시 실행중에 재활용을 위해 반납해야 합니다. 이렇게 프로그램 실행 중에 저장 공간을 할당하는 것을 동적 할당 이라 합니다.
malloc, free 함수
- 프로그램 실행중 메모리를 동적 할당할 때는 malloc 함수를, 반환할 때는 free 함수를 사용합니다.
- 이 함수들을 사용할 때는 stdlib.h. 헤더파일을 인클루드해야 사용할 수 있습니다.
- 함수 원형
- void *malloc(unsigned int size);
- void free(void *p);
- malloc 함수는 주어진 인수의 바이트 크기만큼 메모리에서 연속된 연속된 저장공간을 할당한 후에 그 시작 주소를 반환
- 이때 인수값을 직접 바이트수를 인수로 주는 것보다 sizeof 연산자로 각 자료형에 대한 크기를 계산하여 주는 것이 좋습니다.
- 그러면 컴파일러에 다라 int형 변수의 크기가 다르더라도 프로그램을 수정할 필요가 없습니다.
- malloc 함수는 (void *)형을 반환합니다. 따라서용도에 맞는 포인터형으로 형 변환하여 사용
- int* p = (int*) malloc(sizeof(int));
- 동적 할당한 저장 공간을 int형 변수로 쓰기 위해 int형을 가리키는 포인터에 저장
주의사항
- malloc 함수의 반환값이 널 포인터인지 반드시 확인하고 사용해야 합니다.
- 메모리 할당 함수는 원하는 크기의 공간을 할당하지 못하면 0번지인 널 포인터를 반환합니다.
- 널 포인터는 보통 NULL로 푤기하는데 전처리 단계에서 0으로 바뀌므로 정수 0과 같다고 생각해도 됩니다. 널 포인터는 포인터의 특별한 상 태를 나타내기 위해 사용하므로 간접참조연산을 할 수 없습니다. 따라서 malloc 함수가 널 포인터를 반환한 경우 그 값을 참조함녀 실행 중에 에러 메시지를 표시하고 비정상 종료합니다.
- 사용이 끈난 저장 공간은 재활용할 수 있도록 반환해야 합니다.
- 자동 지역 변수의 저장 공간은 함수가 반환될 때 자동으로 회수되지만 동적으로 할당한 저장 공간은 함수가 반환된 후에도 그대로 메모리에 남아 있습니다. 따라서. 함수가 반환되기 전에 동적할 당한 저장공간은 free 함수로 직접 반환해야 합니다.
- 물론 main함수를 종료하면 어차피 메모리 공간은 반환됩니다. 하지만 메모리해제 습관을 두지 않으면 1년 내내 돌아가는 서버프로그램의 경우 문제가 생깁니다. 따라서 사용한 메모리는 반드시 해제하는 습관을 들여야 합니다.
기타 동적 할당 함수
- calloc 함수는 할당한 저장 공간을 0으로 초기화
- 메모리를 동적으로 할당하여 0으로 초기화된 메모리 공간을 얻고자 할 때 calloc 함수를 사용하면 편리합니다.
- calloc 함수 원형
- void* calloc(unsigned int, unsigned int);
- int* pi = (int*)calloc(5, sizeof(int)); // 0으로 초기화 된 5개의 int형 변수
-------------------------------------------------------------------------------------------------------------
출처 : 혼자 공부하는 C언어
'Programming Language > C programming' 카테고리의 다른 글
[C] 배열 (0) | 2021.02.22 |
---|---|
[C] 16-1 동적 할당 함수 (배열처럼 사용하기) (0) | 2021.02.12 |
[C] temp 없이 Swap 하는 방법 (0) | 2021.01.31 |
[C] C언어 강좌-2, C언어 컴파일 과정 (0) | 2021.01.26 |
[C] C언어로 Insertion Sort 구현 해보기 (0) | 2021.01.10 |
Comments