2016년이 지나고 2017년 새해가 밝았습니다. 2017년에는 2016년보다 좀 더 열심히 공부할 생각입니다. 


동적 메모리

 메모리에는 정적 메모리와 동적메모리가 있습니다. 정적 메모리는 여태 공부하면서 사용했던 배열이나, 프로그램 실행 전에 선언했던 변수등이 사용하는 공간을 뜻합니다. 반대로 동적 메모리는 프로그램 실행 시점에서 메모리 공간을 설정하고 사용할 수 있는 메모리 공간으로 프로그램이 실행되는 동안에 필요한 변수나 배열 등을 동적으로 할당합니다. 

 얼만큼 사용할지 모르는 공간을 정적 메모리로 할당하면, 메모리를 낭비하게 될 수 있는데, 동적 메모리를 사용하면 필요한 만큼만 할당하기 때문에 메모리 낭비를 줄일 수 있습니다. 

 동적메모리는 이름이 없고, 메모리 주소를 포인터 변수에 저장해서 사용하며,  타입에 따라 형변환을 해서 사용합니다. 동적 메모리는 표준 라이브러리 stldib.h를 인클루드하면 사용할 수 있습니다. 동적 메모리를 할당하면 반환을 해줘야합니다. 반환을 하지 않으면 메모리 누수가 발생합니다. malloc함수를 사용해 할당하고 free함수를 사용해 반환합니다.

 동적메모리 사용은 다음과 같습니다.

----------------------------------------------------------------------------------------

#include <stdio.h>

#include <stdlib.h>


int main()

{

int *value; // 정수형 포인터 변수 선언

value = (int*)malloc(4); // 4바이트 크기의 동적 메모리 할당

*value = 100;


printf("valuie : %d\n", *value);

free(value); // 메모리 반환

}

----------------------------------------------------------------------------------------


 컴파일러에 따라서 int 타입의 크기가 2바이트로 할당하기도하고 4바이트로 할당하기도 합니다. 이때 sizeof 연산자를 사용하면 타입의 크기를 반환하게 되서 컴파일러에 맞게 사용할 수 있습니다. 다른타입 역시 마찬가지로 sizeof연산자를 이용해서 사용할 수 있습니다.

----------------------------------------------------------------------------------------

#include <stdio.h>

#include <stdlib.h>


int main()

{

int *a;

float *b;

double *c;

char *d;


a = (int*)malloc(sizeof(int));

b = (float*)malloc(sizeof(float));

c = (double*)malloc(sizeof(double));

d = (char*)malloc(sizeof(char));


*a = 100;

*b = 3.14;

*c = 5.25;

*d = 'a';


printf("a : %d\n", *a);

printf("b : %.2f\n", *b);

printf("c : %.2f\n", *c);

printf("d : %c\n", *d);


free(a);

free(b);

free(c);

free(d);

}

----------------------------------------------------------------------------------------


 배열 또한 동적으로 메모리를 할당할 수 있습니다. 아래 코드와 같이 할당하고 사용할 수 있습니다.

----------------------------------------------------------------------------------------

#include <stdio.h>

#include <stdlib.h>

#pragma warning(disable:4996)


int main()

{

int count, i, input;

int *array;

printf("배열의 크기를 입력하세요 : ");

scanf("%d", &count);

array = (int*)malloc(sizeof(int)*count); // 메모리공간을 정수형크기 * 입력한 수 만큼 할당


for (i = 0; i < count; i++)

{

printf("%d 번째 수 : ",i);

scanf("%d", &input);

*(array + i) = input; // 입력받은 값을 배열의 0번째부터 저장

}


printf("---------------------------\n"); // 구분선


for (i = 0; i < count; i++)

{

printf("*(array+%d) : %d\n", i, *(array + i)); // 배열의 0번째부터 출력

}


free(array); // 메모리 반환


}

----------------------------------------------------------------------------------------


* 출처 : 한국기술교육대학교 온라인평생교육원 C 프로그래밍_2 

          스타일 C프로그래밍 저.김종훈,김종진 출.WellBook




'언어 > C' 카테고리의 다른 글

[C] 파일 입·출력  (0) 2017.01.05
[C] 자기 참조 구조체와 연결리스트  (2) 2017.01.04
[C] 공용체  (0) 2016.12.27
[C] 구조체  (2) 2016.12.26
[C] 배열과 포인터  (3) 2016.12.25

+ Recent posts