파이썬과 친해지기 - 4일차 (Stack, Heap, Malloc, Free)

2021. 10. 31. 18:47·아카이브/일기
반응형

저번에는 Stack에 대한

코드를 작성해보고 학습했다.

 

이제 아래의 이미지를 살펴보자.

 

또한, 아래의 사이트에서

설명을 읽어보자

( http://www.tcpschool.com/c/c_memory_structure )

 

이전에 Stack과 Heap에 대한 개념을

비유와 함께 어느정도 익혔다.

위의 내용을 전부 이해하지는 못하더라도

대충 느낌은 알 수 있을 것이다.

 

Heap 영역에 대한 설명을 보면

"힙 영역은 사용자가 직접 관리할 수 있는"

"그리고 관리를 해야만 하는 영역이다."

"힙 영역은 사용자에 의해 메모리 공간이"

"동적으로 할당되고 해제된다."

 

한 줄로 요약해보면,

"힙 영역은 사용자가 동적으로 관리하는 영역"

정도로 이해하면 될 것 같다.

 


힙(Heap) 정렬이라는 것도 있다.

이는 힙(Heap)이라는 데이터 구조를 사용해서

수열을 정렬하는 알고리즘이다.

 

대략적인 힙 알고리즘 설명을 해보자면,

1. Heap에 모든 숫자를 저장한다.

2. 이를 내림차순으로 구축한다.

3. Heap에 저장된 숫자를 하나씩 꺼낸다.

4. 내림차순 힙은 큰 것부터 순서대로 데이터를

추출하는 성질이 있으므로 꺼낸 숫자를 역순으로

나열하면 정렬이 완료된다.

 

일반적인 사용 방법을 짧게 설명하면,

수열이 저장 되어 있는 배열 자체에

힙(Heap)을 넣어서 배열상에서

숫자를 교체해가며 정렬한다.

 

 

힙(Heap)에 대해서 검색하면

힙 영역과 힙 정렬 이렇게 2개가

검색되기 때문에,

헷갈렸을 것 같아서 설명했다.

 

< 힙 영역 >

메모리에 데이터를 쌓을 수 있는 공간

 

< 힙 정렬 >

배열을 이진트리로 해석해 정렬하는 알고리즘

 


< Malloc & Free >


malloc의 사용법

void* malloc(size_t size)

 

size_t는 동적으로 할당할

메모리의 크기를 말한다.

성공 시, 할당한 메모리의

첫 번째 주소를 리턴해준다.

실패 시, NULL을 리턴한다.


free의 사용법

void free(void *ptr)

 

ptr은 해제하고자 하는

메모리의 포인터를 말한다.


 

동적에 대한 설명은 이전에 했으니

넘기도록 하겠다.

 

malloc와 free를 어떻게 사용해야 할까?

코드를 작성해 보기 전에

생각을 해보자.

 

사용자에게 선택지를 줘보자.

1. 배열 크기 지정

2. 배열에 숫자 넣기

3. 배열 출력

 

이렇게 하면 충분히 동적으로 보인다.

한번 코드를 작성해보자.

 

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

// malloc 사용법
// => void* malloc(size_t size)
// size_t : 동적으로 할당할 메모리의 크기
// 성공시 할당한 메모리의 첫번째 주소 리턴, 실패시 NULL리턴

// free 사용법
// => void free(void *ptr);
// ptr : 해제하고자 하는 메모리의 포인터

void menu_print() {
    printf("\n======================\n");
    printf("0. 종료\n");
    printf("1. 배열 크기 지정\n");
    printf("2. 배열에 숫자 넣기\n");
    printf("3. 배열 출력\n");
    printf("======================\n");
    printf("\n 선택 : ");
}

void main() {
    int select;
    int temp_memory_size;
    int temp_memory_num = 0;
    int *memory;
    while(1) {
        menu_print();
        scanf("%d", &select);

        if(select == 1) {
            temp_memory_size = 0;
            memory = 0;
            temp_memory_num = 0;
            printf("\n 배열 크기 지정 : ");
            scanf("%d", &temp_memory_size);
            
            // 메모리 동적 할당
            memory = (int*)malloc(sizeof(int) * temp_memory_size);
        }else if(select == 2) {
            if(temp_memory_size <= temp_memory_num) {
                printf("\n ! 배열이 가득 찼습니다 !\n");
            } else {
                printf("\n 배열에 숫자 넣기 : ");
                scanf("%d", &memory[temp_memory_num]);
                temp_memory_num++;
            }
        }else if(select == 3) {
            printf("\n < 배열 출력 > \n");
            for(int k = 0; k < temp_memory_size; k++) {
                printf("%d\n", memory[k]);
            }
        }else if(select == 0) {
            free(memory);
            break;
        }
    }
}

 

malloc를 언제 자주 사용할지

생각해봤다.

내가 생각했을 때는,

배열 크기를 동적으로 할당할 때.

라고 생각한다.

 

메모리 누수를 막기 위해서는

위 처럼 Heap 영역을 제어해야한다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'아카이브 > 일기' 카테고리의 다른 글

309일차 - 완전성 & 목적성 & 독립성, Fragment New Instance, MVVM, LiveData, 옵저버, 스코프 함수, 싱글톤, XML 호환성 등  (0) 2021.11.03
308일차 - 현재 상황 및 공부 예정 목록  (0) 2021.11.02
307일차 - 가독성과 안전한 코드, also, with, let, run, apply, Room  (0) 2021.11.01
306일차 - 간단한 조사(AI, DL 설명 및 사용 기술)  (0) 2021.10.31
305일차 - Stack, Heap, Malloc, Free  (0) 2021.10.30
Kotlin - Room을 활용한 간단한 게시판 CRUD 앱 개발하기  (0) 2021.10.29
304일차 - Kotlin Room을 활용한 간단한 게시판 만들기  (1) 2021.10.29
IMS 면접 합격  (0) 2021.10.29
'아카이브/일기' 카테고리의 다른 글
  • 307일차 - 가독성과 안전한 코드, also, with, let, run, apply, Room
  • 306일차 - 간단한 조사(AI, DL 설명 및 사용 기술)
  • 305일차 - Stack, Heap, Malloc, Free
  • Kotlin - Room을 활용한 간단한 게시판 CRUD 앱 개발하기
권퓨터
권퓨터
만드는 걸 좋아하는 개발자의 기록. 코드든 글이든, 일단 만들어 봅니다.
  • 권퓨터
    권퓨터: Kwonputer
    권퓨터
  • 티스토리 홈 관리자
  • 전체
    오늘
    어제
    • 분류 전체보기 (557) N
      • 개발 (56)
        • 프로젝트 (5)
        • 모바일 (44)
        • 프론트엔드 (0)
        • 백엔드 (2)
        • 인프라 (0)
        • AI · 머신러닝 (4)
      • IT · 테크 (8) N
        • 기술 트렌드 (3)
        • 도구 · 생산성 (1)
        • 제품 리뷰 · 추천 (0)
        • 마케팅 · 수익화 (4) N
      • 자기계발 (7)
        • 공부법 · 언어 (0)
        • 취업 · 커리어 (7)
      • 아카이브 (486)
        • 일기 (480)
        • 취미 (6)
  • 블로그 메뉴

    • 홈
  • 링크

    • 블로그 이전
  • 공지사항

    • 서브 블로그 => https://kwonputer.com/
  • 인기 글

  • 태그

    injectable
    다국어 블로그
    상태관리
    파이썬
    1인개발
    https://www.kwonputer.shop/
    python 기초
    flutter 개발자
    Single Table Design
    서버리스 아키텍처
    flutter
    aws lambda
    클린 아키텍처
    flutter 면접 질문
    FACEBOOK광고
    ai 게임 개발
    AWS CDK
    TypeScript
    Clean Architecture
    dynamodb
    riverpod
    내러티브 게임
    크로스플랫폼
    사이드프로젝트
    OpenAI GPT
    kotlin
    https://github.com/kwongeneral/kortfolio.git
    python
    Prompt Engineering
    파이썬 기초
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
권퓨터
파이썬과 친해지기 - 4일차 (Stack, Heap, Malloc, Free)
상단으로

티스토리툴바