ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 기초#14 동적 메모리와 연결 리스트
    Programming 기초/C Language 2023. 5. 3. 19:49

    * 동적 할당 메모리
    프로그램이 메모리를 할당받는 방법에는 정적과 동적의 2가지 방법이 있다.
    정적 메모리 할당(static memory allocation)이란 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당받는 것이다. 이 경우, 메모리의 크기는 프로그램이 시작하기 전에 결정되며 프로그램의 실행 도중에 크기가 변경될 수는 없다.

    int score_s[100];
    //배열을 선언하면 정적으로 메모리 할당받는다.

    동적 메모리 할당(dynamic memory allocation)이란 프로그램이 실행 도중에 동적으로 메모리를 할당받는 것을 말한다. 필요한 만큼의 메모리를 할당받아 사용하고, 메모리를 반납한다.

    score = (int *) malloc(100*sizeof(int));

     
    그렇다면 동적 할당이 필요한 이유를 예시를 통해 알아보자.

    int n;
    printf("배열의 크기를 입력해주세요: “);
    scanf("%d", &n);
    
    int array[n];
    

    실제로 위의 코드를 실행하면 에러가 발생한다. 배열 array를 선언할 때 배열의 크기를 n으로 받는데, 배열은 컴파일될 때 그 크기가 결정되어야 하는 정적할당 방식을 취한다. 하지만 위 코드에서는 n이 컴파일 이후에 결정되는 변수이기에 배열은 그 크기가 정해지지 못한다. 이 같이 입력을 받아 그 입력 값을 활용하고자 할 때 동적할당 방식이 필요한 것이다.

    정적할당은 결국 컴파일시에 메모리에 변수의 크기를 할당하는 과정이고, 동적할당은 런타임시에 주소를 할당받는다.
    동적할당은 포인터 개념을 활용해야만 한다.

    int n;
    int *array;
    int *ptr=NULL;
        
    printf("배열의 크기를 입력해주세요: ");
    scanf("%d", &n);
    printf("%d\n",n);
        
    // malloc은 동적할당된 메모리의 첫 번째 주소를 반환해준다.
    // malloc의 타입은 void* 이므로, 명시적 형변환을 해준다.
    array = (int*) malloc(n * sizeof(int));


    직관적으로 눈으로 확인하기 위해 아래와 같이 배열을 만들어보았다.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int n;
        int *array;
        int *ptr=NULL;
        
        printf("배열의 크기를 입력해주세요: ");
        scanf("%d", &n);
        printf("%d\n",n);
        
        // malloc은 동적할당된 메모리의 첫 번째 주소를 반환해준다.
        // malloc의 타입은 void* 이므로, 명시적 형변환을 해준다.
        array = (int*) malloc(n * sizeof(int));
        ptr = array;
        
        for (int i = 0; i < n; i++ ){
            *ptr = i*5; 
            ptr++;
        }
        printf("%d\n", *array);
        printf("%d\n", *(array+1));
        printf("%d\n", *(array+2));
        printf("%d\n", *(array+3));
        free(array);
        
        return 0;
    }
    
    ---------------------------------------------------------------------------
    배열의 크기를 입력해주세요: 4
    0
    5
    10
    15


    위 코드를 배열 접근 연산자, ‘[ ]’ 를 이용해서 리팩토링하자. (Feat. Chat GPT)

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int n;
        
        printf("배열의 크기를 입력해주세요: ");
        scanf("%d", &n);
        printf("%d\n", n);
        
        // 배열 동적 할당
        int *array = (int*)malloc(n * sizeof(int));
        if (array == NULL) { // 메모리 할당 실패 시 처리
            printf("메모리 할당 오류\n");
            return 1;
        }
        
        // 배열 초기화
        for (int i = 0; i < n; i++) {
            array[i] = i * 5;
        }
        
        // 배열 요소 출력
        for (int i = 0; i < n; i++) {
            printf("%d\n", array[i]);
        }
        
        // 메모리 해제
        free(array);
        
        return 0;
    }


    작성중...

    댓글

Designed by Tistory.