[C 언어] - Dynamic Memory Allocation

RuiN·2022년 8월 4일
0

C

목록 보기
5/6
post-thumbnail

동적메모리 할당

보통은 변수로 메모리를 할당 하지만,
그것 대신 프로그램의 요청으로 메모리를 할당 할 수 있습니다.
그것이 바로 동적 메모리 할당(Dynamic Memory Allocation) 입니다.

malloc 함수를 호출하여 동적메모리 할당을 요청하면 요구하는 크기만큼의 메모리를 할당하고
시작 주소를 반환 합니다.

    int * p;
    p = (int *) malloc(40);
    if (p == null) {
        // 동적 메모리 할당이 실패
        // 적절한 조치를 취하는 로직 생성
    }

    p[0] = 12;
    p[1] = 24;
    *(p+2) = 36;
  • P라는 포인터 변수를 선언
  • malloc 함수를 통해서 40바이트 만큼의 메모리를 할당
  • malloc 으로 할당받은 메모리는 보통의 배열처럼 사용이 가능
    • ( int * ) 는 작성하지 않아도 되지만, 표시해주는 것이 가독성이 좋음

배열 키우기

여기서 동적메모리 할당의 주된 특징은
동적으로 할당된 배열의 공간이 부족할 경우에 더 큰 배열을 할당하여 사용이 가능합니다.

    int *array = (int *) malloc(4 * sizeof(int)); // == malloc(16);
    
	//    배열 array의 크키가 부족한 상황이 발생한다.

    int *tmp = (int *) malloc(8 * sizeof(int));
    int i;
    for (int i = 0; i < 4; ++i) {
        tmp[i] = array[i];
    }
    array = tmp;
  • malloc( 4 * sizeof ( int ) ) ; 로 할당한 이유는 int의 크기가 4바이트가 아닌 다른 크기일 수도 있기때문에
    동적으로 변경될 수 있게 선언한것
  • tmp 라는 32바이트 크기의 포인터 변수 선언
  • tmp배열에 array의 값을 순서대로 주입해준다
  • 그다음, array 의 배열을 tmp 로 변경한다.

그러나 이러한 방법이 반복된다면 array같은 버려지는 배열은 쌓이면서 프로그램의 속도를 저하 시킬 수 있다.
그것을 처리하는 방법은 나중에 다루겠다.


Question!!!

아니 위에 로직에서

 int *array = (int *) malloc(4 * sizeof(int));   //  1
 int array[4]; 									 //  2

??? : 아니 그러면 1번 * array로 선언하지 말고 , 2번 array[4] 로 선언해도 상관없는거 아닌가요??

앞서 이전 포스팅 ( Pointer & Array ) 을 참고 하면!
array[4] 로 선언할 경우 같은 배열이 나오는 것은 맞다 .
하지만! array라는 배열의 주소값을 가진 포인터 변수는 변경이 불가 하다는 점이 있다.

그리고 또 하나는 array[4]로 선언했을 경우
LifeTime 에 대한 Problem이 발생하게 된다. 이 또한 나중에 다루도록 하겠습니다.

profile
어디까지 올라갈지 궁금한 하루

0개의 댓글