몽상실현개발주의

[따배씨] 12.13 메모리 동적 할당 본문

Language/C

[따배씨] 12.13 메모리 동적 할당

migrationArc 2021. 6. 14. 21:51

[따배씨] 12.13 메모리 동적 할당

따배씨 - 따라하며 배우는 C언어

12강 Storage Classes, Linkage and Memory Management

12.13 메모리 동적 할당 Dynamic Storage Allocation

  • 동적 할당 메모리는 포인터만 가져오고 인식자가 없음
  • Heap 메모리 영역에 저장, 프로그래머가 반납하기 전까지 유지
    • 프로그램이 종료되면 자동 반납
  • 필요한 메모리의 크기를 미리 알 수 없을 경우 사용
    • Runtime 에 메모리 크기가 결정되는 경우, VLA 가변 길이 배열 등

 

 

#include <stdio.h>
#include <stdlib.h> // malloc(), free()

int main(){
    /*
        malloc() returns a void type pointer.
        void% : generic pointer
     
        free() deallocates the memory
     */
    
    double* ptr = NULL;
    
    ptr = (double*)malloc(30 * sizeof(double));
    
    if (ptr == NULL){
        puts("Memory allocation failed.");
        
        /*
            exit(EXIT_FAILURE) is similar to return 1 IN main().
            exit(EXIT_SUCCESS) is similar to return 0 IN main().
         */
        
        exit(EXIT_FAILURE);
    }
    
    printf("Before free %p\n", ptr);
    // Before free 0x100611950
    
    free(ptr);
    
    printf("After free %p\n", ptr);
    // After free 0x100611950
    
    ptr = NULL; // optional
    
    return 0;
}
double* ptr = NULL;
ptr = (double*)malloc(30 * sizeof(double));
  • 운영체제에게 메모리를 요청할때는 Memory allocation - malloc() 함수 사용
malloc(필요한 공간 입력, size_t type);
  • 입력한 공간 만큼 heap 메모리 공간을 할당
  • 할당된 연속된 메모리 공간의 첫번째 주소를 반환
  • 반환 값은 void 형의 pointer - generic pointer
(double*)malloc(필요한 공간 입력, size_t type);
  • 반환 된 void 형의 pointer 값을 double 형의 pointer 로 변환
if (ptr == NULL){
  exit(EXIT_FAILURE);
}
  • 메모리 공간이 할당되지 않았을 때의 Error 처리
exit(EXIT_FAILURE);
  • 어떤 위치에서든 프로그램 강제 종료
free(ptr);    
ptr = NULL; // optional
  • 메모리를 반환 하여도 ptr 값은 메모리 주소를 가르키고 있으므로, NULL 처리 하는것이 좋다

 

 

#include <stdio.h>
#include <stdlib.h> // malloc(), free()

int main(){
    /*
        Dynamically Allocated Array
     */
    int n = 5;
    double* ptr = (double*)malloc(n * sizeof(double));
    
    if (ptr != NULL){
        for (int i = 0; i < n; ++i)
            printf("%f ", ptr[i]);
        printf("\n");
        
        for (int i = 0; i < n; ++i)
            *(ptr + i) = (double)i;
        
        for (int i = 0; i < n; ++i)
            printf("%f ", ptr[i]);
        printf("\n");
    }
    
    free(ptr);
    ptr = NULL;
    
    return 0;
}
  • 동적 할당 메모리를 길이가 변할 수 있는 배열처럼 사용 가능, VLA 보다 동적 할당 메모리가 선호됨
    • 동적 할당 메모리를 배열로 사용하면 크기를 변화시키는 것이 가능한 것이 장점
    • VLA 는 stack 영역(컴파일러에 따라 다름), 동적할당 메모리는 Heap 영역
    • Heap 영역의 크기가 stack의 크기보다 큼

 

 


이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.

http://blog.naver.com/atelierjpro

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

 

 

Comments