프로그래밍 언어/C

C언어 22강) 동적메모리할당과 포인터변수를 통한 배열

happy_life 2020. 11. 12. 16:47

포인터 변수에 동적 메모리를 할당하면, 배열처럼 사용할 수 있다.

 

abcdefgh123123.tistory.com/73

▲동적 메모리 할당 malloc 함수는 이 글에 잘 설명되어있으니 참고하자.

 

정리에 앞서 먼저 배열이란 무엇인가??

abcdefgh123123.tistory.com/31

 

C언어 10강 배열(array)/문자열(char 활용)

●배열(array) 1)정의: 같은 종류의 데이터 타입을 선언하기 위해 구성된 데이터의 집합. *일반변수 선언과의 차이: 일반변수의 경우에는 따로 분리된 변수 이름을 사용하지만, 배열은 변수를 한

abcdefgh123123.tistory.com

▲구체적인 설명은 이 글을 참조하자.

 

배열이란 같은 종류의 데이터 타입을 선언하기 위해 구성된 데이터의 집합이다. 그리고 각 요소는 인덱스를 통해 참조할 수 있다.


그렇다면, malloc함수를 통해 메모리 주소를 할당하고 포인터 변수를 활용해 배열처럼 할 수 있는 방법도 있을까? 답은 Yes이다. 

malloc 함수, 포인터 변수를 사용해 동적 메모리를 할당함으로써, 배열처럼 만들 수 있는 방법이 있다. 밑의 예제를 보자

 

 

동적메모리 할당해서 배열처럼 활용하기 코드 예제

#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일

int main()
{
    int *numPtr;    
    
    numPtr = malloc(sizeof(int) * 9);// int 9개 크기만큼 동적 메모리주소 할당
    numPtr[0] = 10;    // 배열처럼 인덱스로 접근하여 값 할당 (*numPtr 로 역참조한 방법이랑 다름)
    numPtr[8] = 20;    // 배열처럼 인덱스로 접근하여 값 할당 (*numPtr 로 역참조한 방법이랑 다름)

    printf("%d\n", numPtr[0]);    // 배열처럼 인덱스로 접근하여 값 출력
    printf("%d\n", numPtr[8]);    // 배열처럼 인덱스로 접근하여 값 출력

    free(numPtr);    // 동적으로 할당한 메모리 해제

    return 0;
}

결괏값

10               20

 numPtr [0]                                    numPtr [8]   ↖메모리는 이런 모양으로 되어있는 것.   

                                                                  (배열 같지 않은가? index로  참조할 수 있다!!) 

 

주의할 점

*배열처럼 하려면 반드시 sizeof(int) *n  곱하기 형식으로 되어있어야 함.

 

동적 메모리를 할당하여 1차원 배열로 활용할 수 있다면 2차원 배열도 동적 메모리를 통해 만들 수 있지 않을까? YES

 

포인터 변수에 동적 메모리를 할당하여 2차원 배열로 활용

 

●코드 예제

#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일

int main()
{
    //3행 4열의 2차원 배열을 만들어보자

    int** m; //이중포인터 변수 선언
    
    m = malloc(sizeof(int*) * 3);// int* 3개 크기만큼 동적 메모리주소 할당
    
    for (int i = 0; i < 3; i++)
    {
        m[i] = malloc(sizeof(int) * 4);

    }

    for (int i = 0; i < 3; i++) //2차원 배열의 요소에 i+j 값 넣고 출력
    {
        for (int j = 0; j < 4; j++)
        {
            m[i][j] = i + j;

            printf("%d", m[i][j]);
          
        }
        printf("\n");
    }


    for (int i = 0; i < 3; i++)
    {
        free(m[i]);  //동적으로 할당한 가로 공간 메모리 해제
    }

    free(m);    // 동적으로 할당한 세로 공간 메모리 해제

    return 0;
}

결괏값

 

 

코드 해석

m = malloc(sizeof(int*) * 3);// int* 3개 크기만큼 동적 메모리주소 할당

1. int 대신 int* 를 사용한 이유는 컴퓨터 사용 환경에 따라 int와 int *의 메모리 크기가 다르기 때문이다. 

위 코드를 통해  m은 int* size 크기의 메모리를 3개 할당 받는다.

m[0]
m[1]
m[2]

 

    for (int i = 0; i < 3; i++)
    {
        m[i] = malloc(sizeof(int) * 4);

    }

 

이 코드를 통해  m [i]는 이제  int size 크기의 메모리를 4개 할당받는다.

m[0][0] m[0][1] m[0][2] m[0][3]
m[1][0] m[1][1] m[1][2] m[1][3]
m[2][0] m[2][1] m[2][2] m[2][3]

이렇게 이중 포인터를 통해 동적 메모리를 두 번 할 당하면, 2차원 배열의 모양이 등장한다.

 

 

m을 한번 참조하면 m [i]에  m [i][j]의 값의 메모리 주소가 등장한다. 그 메모리 주소를 한번 더 참조하면 m[i][j]의 값이 나오는 것이다.