데이터 영역 전역 변수와 static 변수가 할당되는 영역이다. 프로그램 시작과 동시에 메모리가 할당되고, 프로그램 종료시까지 남아있다.
스택 영역 지역변수와 매개변수가 할당되는 영역이다. 함수를 벗어날 경우 소멸한다.
힙 영역 동적 할당된 메모리들이 존재하는 공간이다.
# 메모리 할당하는 방법
정적 메모리 할당 정적 메모리 할당은 변수 선언을 통해 필요한 메모리를 확보하는 방법이다. 예제)
#include <stdio.h>
#include <string.h>
int sum(int a, int b)
{
return a + b;
}
int main(void)
{
int num1 = 3;
int num2 = 4;
static num3 = 5;
printf("%d", sum(num1, num2));
return 0;
}
--> 위의 소스코드가 컴파일 될 때, 변수들은 다음과 같이 메모리 공간에 저장된다.
위에서 정리한 내용처럼, 정적 변수인 num3는 데이터 영역에 저장되고, main 함수에 선언된 num1, num2와 sum 함수의 매개변수인 a, b는 스택 영역에 저장된다.
이렇게 하는 것의 장단점은? - 장점 : 메모리 누수를 걱정하지 않아도 된다. 일단 컴파일 해서 메모리를 할당받은 뒤에 운영체제가 알아서 메모리 공간을 회수하기 때문이다. - 단점 : 메모리 공간의 크기가 정해져 있어서, 더 큰 공간이 필요하더라도 추가할 수가 없고, 더 작은 공간이 필요한 경우 메모리 공간의 낭비가 발생한다.
동적 메모리 할당 실행 단계에서 메모리 공간을 할당받는 것이다. 포인터를 사용해서 직접 Heap영역을 가리켜, 해당 공간을 빌리는 것이다. 예시1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int *num1;
num1 = (int*)malloc(sizeof(int));
*num1 = 10;
printf("동적 할당 : %d\n", *num1);
free(num1);
printf("동적 할당 : % d", *num1);
}
// 실행결과
동적 할당 : 10
동적 할당 : -572662307
malloc 함수 malloc 함수는 동적 메모리를 할당하기 위해 사용되는 함수이다. 이 함수를 사용하기 위해서는 stdlib.h 헤더파일을 포함해줘야 한다. malloc 함수의 괄호 안에 할당할 메모리의 크기를 써준다.
--> 동적 할당은, 정적 할당과 반대로 메모리 누수를 걱정해야 한다.
free함수를 통해 동적 할당된 기억공간을 반환해야 한다.
반환하고 나면, 무의미한 값이 변수에 들어가 있는 것을 볼 수 있다.
예시2) "Hi", "My name is Minsu", "How are you?" 세 문장을 "동적 할당"으로 저장하고 출력하는 예제
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char tmp[30];
char* str[3]; // 포인터배열 선언
for (int i = 0; i < 3; i++)
{
printf("문자열을 입력하세요.");
gets(tmp);
str[i] = (char*)malloc(strlen(tmp) + 1); // 동적 할당
strcpy(str[i], tmp);
}
for (int i = 0; i < 3; i++)
{
printf("%s\n", str[i]);
free(str[i]); // 메모리 반환
}
}
//실행결과
문자열을 입력하세요.Hi
문자열을 입력하세요.My name is Minsu
문자열을 입력하세요.How are You?
Hi
My name is Minsu
How are You?
gets : 문자열을 입력받는 함수
strlen : 문자열의 길이를 반환하는 함수
strcpy : 문자열을 복사, 붙여넣기 하는 함수
동적 메모리 할당을 할 경우의 장점을 눈에 보이지 않지만 메모리 영역에서 낭비되는 메모리 공간을 줄일 수 있다는 장점이 있다.