-
[C/C++] 메모리영역기초/C,C++ 2017. 3. 7. 09:09
코드영역
*실행할 프로그램의 코드가 저장되는 메모리 공간이다.
*CPU가 코드영역에 저장된 명령문을 하나씩 가져다가 실행한다.
힙영역
*프로그래머가 원하는 시점에 메모리 공간에 할당 및 소멸을
하기위한 영역이다.
데이터영역
*전역변수 static 변수가 할당되는 영역
*프로그램시작과 동시에 할당되어 종료시까지 남아있는 특징의
변수가 저장되는 영역스택영역
*지역변수와 매개변수가 할당되는 영역
*함수를 빠져나가면 소멸되는 변수를 저장하는 영역
데이터영역 = static & 전역변수
스택영역 = 지역변수 & 매개변수fre
정적(static)
int num;
int num2[10];
프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당받는 것이다.
메모리의 크기는 프로그램이 시작하기 전에 결정된다.
(자동으로 잡아주기에)
배열처럼 선언된 크기를 벗어나는 곳에 값을 입력하거나
배열의 크기를 고칠 수 없다!
전역 변수를 사용할 경우 call by reference특징으로
맨 마지막에 입력된 값이 남게된다.. 그렇다면?
(call by reference의 좋은 예)
동적(dynamic)
프로그래머가 직접 원하는 구간에서 메모리를 할당하고 해제할 수 있다.
**동적할당을 생성하는 함수**
malloc()
[사용헤더]
stdlib.h
malloc.h
메모리 할당
void* malloc(size);
void *라는 자료형을 리턴하므로 사용하려는 자료형으로 형변환하여 사용한다.
size는 타입의 크기를 구하는 sizeof를 사용하는것을 권장합니다.
메모리 해제
free(void *_Memory)
memory에는 할당한 변수의 이름을 넣는다
위에 코드를 동적할당으로 해보면
typedef struct peo{
char name[20];
int age;
}PEO;int * pn = (int *)malloc(sizeof(int));
float * pb = (float *)malloc(sizeof(float));
double * pd = (double *)malloc(sizeof(double));
char * pc = (char *)malloc(sizeof(char));
PEO * pp = (PEO*)malloc(sizeof(PEO)*num);
strcpy(pp->name,"궁뎅이");
pp->age = 31;이렇게 다른변수들과 구조체역시 malloc으로 가능합니다.
(ex)
배열 처럼 사용이 가능하다.
*********중요*********
메모리를 할당할때 누가 메모리를 사용중이라면?
힙영역에 선언하는 순간 메모리를 할당하는데 그떄 빈 공간이 없다면
사용할 메모리가 없다는 뜻이겠죠,,,
그럼 프로그램 자체도 실행될 수 없게 되겠네요
이럴 때
할당하려는 공간이 없으면 NULL을 반환하기 때문에 메모리 값에 NULL 체크를 해줍니다.
stdlib.h에는
calloc이 있습니다.
malloc함수는 초기값이 없이 쓰레기값이 들어있지만
calloc함수는 초기값 0 이 존재합니다.
사용법은 malloc대신 calloc을 넣어주시면 됩니다.
realloc도 있습니다.
malloc함수의 메모리값을 변경할 수 있습니다.
이 두개는 잘 사용하지않지만 그냥 알아두시면 좋을 것 같습니다.
'기초 > C,C++' 카테고리의 다른 글
[C/C++] 간단한 예제(복습) (0) 2017.03.18 [C/C++] #define, 전처리기, (0) 2017.03.08 [C/C++] 구조체 (0) 2017.03.06 [C/C++] 클래스, 구조체, 함수의 차이점 (0) 2017.03.03 [C/C++] 반환 형식 ,Call by ~ (0) 2017.03.02