가상메모리의 4대 영역
{ 코드영역, 데이터영역, 힙영역, 스택영역 }
코드 영역: 실행할 프로그램의 코드 저장 공간
데이터영역 : 프로그램이 종료될 때까지 유지할 데이터 저장 공간
힙 영역 : 프로그래머가 원하는 형태로 쓸 수 있는 공간
스택 영역 : 잠깐 사용하고 삭제할 데이터 저장 공간
정적 메모리 할당
-프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당
-할당된 크기보다 더 큰 입력은 X
-작은건 메모리 낭비
ex) int i, j;
int buffer[80];
지역변수, 전역변수
동적 메모리 할당
-실행 도중에 메모리 할당
-사용 끝나면 메모리 반납
-malloc() 계열의 라이브러리 함수를 사용
*run-time때 배열의 크기를 정하기 위해서는 배열을 힙 영역에다가 할당해야 함.
-배열을 생성해서 반환하는 함수의 기본 조건 : 함수 내에 선언된 배열이 함수 반환 후에도 소멸되지 않아야 함 -> 힙 영역에 활용
-힙 영역에 대한 이해 :
(1) 사용자가 할당, 소멸
(2) 원하는 순간에 할당, 소멸
(3) 메모리가 자동으로 소멸되지 않음
힙 영역에 할당할 때 : malloc
- 힙 영역에 메모리 공간 할당
- 호출 시 전달되는 수의 크기만큼 바이트 단위로 할당 후 할당된 주소 값 반환
- 포인터 연산 필수
- 할당 실패 시 NULL 반환
#include <stdlib.h>
void * malloc(size_t size); //void-지정되어있지않음
//malloc(n*sizeof(int));//이런식으로 많이 씀
-malloc함수는 주소값의 포인터 형을 결정하지 못한다.
-(void *)는 가리키는 대상의 정보가 담겨있지 않은, 단순히 주소 값 정보만을 담을 수 있는 변수임.
-따로 포인터 형을 직접 결정해줘야함
ex) int * p = (int *)malloc(3*sizeof(int)); //3개의 정수 할당
할당받은 공간 사용
(1) 포인터를 통하여 사용
(2) 동적 메모리를 배열과 같이 취급
free 함수
-힘에 할당된 메모리 공간의 해제를 위한 함수
-전달인자는 malloc 함수의 반환 값
-NULL전달되면 아무사건 X
void free(void* ptr);
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int* pi; // 동적메모리를가리키는포인터
pi = (int* )malloc(sizeof(int)); // ①동적메모리할당
if (pi == NULL){ // 반환값이NULL인지검사
printf(“동적메모리할당오류\n”);
exit(1);
}
*pi=100; // ②동적메모리사용
printf(“%d\n”, *pi);
free(pi); // ③동적메모리반납
return 0;
}
calloc함수(malloc과 다르게 초기화해줌)
-모든 메모리 공간을 0으로 초기화
-쓰레기값이 사용될 위험을 줄임
-똑같이 free함수 사용
-입력인자가 2개
#include <stdlib.h>
void * calloc(size_t elt_count, size_t elt_size);
↑ ↑
몇 개(n) 자료형의 사이즈(sizeof(TYPE))
realloc함수
-할당했던 메모리 블록의 크기 변경
int* p;
p = (int* )malloc(5 *sizeof(int));
p = realloc(p, 7 *sizeof(int));
'Computer Science > C&C++' 카테고리의 다른 글
[C언어] puts, printf / gets, scanf(scanf_s) (0) | 2021.05.22 |
---|---|
[C언어] 함수 중심의 포인터 활용 (0) | 2021.05.19 |
[C언어] 문자열 관련 (0) | 2021.05.16 |
[C언어] 포인터 배열, 헷갈리는 부분들 (0) | 2021.05.13 |
[C언어] dptr을 이용해 *ptr1과 *ptr2 관계 서로 바꾸기 (1) | 2021.05.10 |