반원 블로그

[C 프로그래밍] 동적 메모리_1.기본이론 본문

2017/C 프로그래밍

[C 프로그래밍] 동적 메모리_1.기본이론

반원_SemiCircle 2017. 2. 21. 18:50

#1 동적 배열의 유리성
일반적인 배열로 정수 10개를 입력 받는 프로그램을 작성하고 있다고 생각해보자.

#include <stdio.h>

void main()
{
    int array[10];
}

이 경우의 한계점은 무엇일까?

첫째. 값을 최대로 10개까지밖에 못받는다. 값 20개를 받아야 하는 프로그램으로 고쳐야 한다면 작동의 거의 비슷하지만 코딩 및 컴파일을 다시 해 새로운 프로그램을 생성해야한다. 프로그램이 실행하는 도중에는 최대 10개라는 조건을 변경할 수 없다.
둘째, 값을 1개만 입력할 시 9개의 공간이 놀게된다. 메모리 낭비다.
셋째, 프로그램을 작성할 때 미리 배열의 크기를 예상해야한다. 그러다보니 큰 값을 넣을 수 밖에 없고 메모리 공간 낭비가 더 커진다.

정적 배열의 한계를 해결하기위해 동적 배열을 공부해보도록 하자. 동적 배열은 배열의 길이를 프로그램을 작성, 실행하는 동안 마음대로 바꿀 수 있다. 이는 포인터를 이용해 구현한다.

#2 정적 메모리 vs 동적 메모리
■메모리의 구분
▶정적 메모리
- 정적 배열을 사용하고 프로그램 실행 전에 결정되는 변수 및 배열이 이 공간을 사용한다. 
- 프로그램 실행전에 이미 정해진 변수, 배열 등이 이에 해당한다.
- 동적과의 차이 : 선언할 때 붙인 배열 또는 이름이 있다.
▶동적 메모리
- 프로그램 실행 시점에서 메모리 공간을 설정하고 사용할 수 있는 메모리 공간.
- 프로그램이 실행되는 동안에 필요한 변수나 배열 등을 동적 메모리에 만든다.
- 정적과의 차이 : 변수에 이름이 없다. 메모리 주소를 포인터 변수에 저장해서 사용한다.


#3 동적 메모리 할당 방법
동적 메모리 공간에 변수 선언하는 방법과 구조에 대해 알아보자

#include <stdlib.h> //필요한 헤더 파일에 추가
void* malloc(사용할 메모리의 양) //메모리 할당에 사용할 함수

//사용 예
(int*)malloc(4) //정수형 변수 , int는 4byte 단위이기때문에 4를 적어준다.
(char*)malloc(1) //문자형 변수, char는 1byte 단위이기때문에 1를 적어준다.
(double*)malloc(8) //부동소수형 변수, double은 8byte 단위단위이기때문에 8를 적어준다.
//각 타입의 사이즈는 sizeof함수를 이용해서 확인해보자.

malloc함수를 사용하면 사용자가 원하는 만큼 동적메모리를 설정하고 사용하는 것이 가능해진다. 

이 때 malloc함수는 할당된 메모리의 주소를 반환한다. 다음 그림을 보자.



int의 크기 단위가 4바이트이기 때문에 13,14,15,16. 총 4byte가 할당 되었으며 이때 malloc함수는 첫 주소인 13을 반환하게 된다.

※ 만일 어떤 자료형인지 알 수 없는 경우!
- 진수 형태로 저장되고 자료형은 존재하지 않을 때에는 void 타입을 이용하여 주소값인 void 포인터(void*)타입을 넘기도록 하자.


연습 3_1

#include <stdio.h>
#include <stdlib.h>

void main(){
    int * value;
    value = (int*)malloc(4); // 또는 (int*)malloc(sizeof(int);
    *value = 100;

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

실행 결과 ▷ ideone으로 확인하기

value : 100

#4 동적 메모리 사용을 위한 자료형 크기를 알 수있는  sizeof 연산자

int는 몇 바이트인가? 위에서는 4byte라 했지만 이는 정확한 답변이 아니다. 다음 사진을 보자.



같은 int형이지만 컴파일러, OS에 따라 단위를 다르게 잡을 수도 있다.

현재 주로 사용되는 32비트와 64비트의 자료형을 다음 표로 확인하자


이는 sizeof 연산자로 확인할 수 있으니 다음 코드를 연습해보자.

연습 4_1

#include <stdio.h>
#include <stdlib.h> 
#include <limits.h>

int main(void)
{

        printf("### 1 Byte = 8 bit ###\n");
        printf("int : %d byte\n",sizeof(int));
        printf("unsigned int : %d byte\n",sizeof(unsigned int));
        printf("long int : %d byte\n",sizeof(long int));
        printf("unsigned long int : %d byte\n",sizeof(unsigned long int));
        printf("long long int : %d byte\n",sizeof(long long int));
        printf("float : %d byte\n",sizeof(float));
        printf("double : %d byte\n",sizeof(double));
        printf("long double : %d byte\n",sizeof(long double));
        printf("(void *) : %d byte\n",sizeof(void *));
        printf("\n");
        printf("INT_MAX = %d\n", INT_MAX);
        printf("UINT_MAX = %ud\n", UINT_MAX);
        printf("LONG_MAX = %ld\n", LONG_MAX);
        printf("ULONG_MAX = %lud\n", ULONG_MAX);

        return 0;

}

실행결과 : ideone으로 확인하기

### 1 Byte = 8 bit ###
int : 4 byte
unsigned int : 4 byte
long int : 8 byte
unsigned long int : 8 byte
long long int : 8 byte
float : 4 byte
double : 8 byte
long double : 16 byte
(void *) : 8 byte

INT_MAX = 2147483647
UINT_MAX = 4294967295d
LONG_MAX = 9223372036854775807
ULONG_MAX = 18446744073709551615d



#5 다음포스팅에서 sizeof 연산자를 이용한 동적메모리 사용법을 알아보자.

Comments