기초/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함수의 메모리값을 변경할 수 있습니다.

이 두개는 잘 사용하지않지만 그냥 알아두시면 좋을 것 같습니다.