happyso
study with happyso
happyso
전체 방문자
오늘
어제
  • 분류 전체보기 (302)
    • GIT (3)
    • 컴퓨터 기본 개념 (29)
    • 알고리즘 (125)
      • 알고리즘 문제 (115)
      • 알고리즘 개념 (10)
    • Go (2)
    • 클라우드 (54)
      • DevOps (4)
      • Kubernetes(쿠버네티스) (33)
      • AWS (6)
      • CKA (8)
    • 리눅스(Linux) (18)
      • 컨테이너(Container) (8)
    • Front (22)
      • JavaScript (2)
      • React (20)
    • Python (21)
      • Python 웹 크롤링 (11)
      • Django (7)
      • MachineLearning (3)
    • 데이터베이스 (6)
      • MariaDB (2)
      • MongoDB (4)
    • C언어 (5)
    • Trouble Shooting (2)
    • 네트워크 (8)
      • CCNA (5)
    • 보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • apply
  • replace
  • 18
  • kubernetes
  • 15
  • edit
  • Patch

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
happyso

study with happyso

15강. 동적메모리할당
컴퓨터 기본 개념

15강. 동적메모리할당

2020. 7. 28. 23:31

<동적 메모리 할당 개념>

- 일반적으로 C언어에서 배열의 경우 사전에 적절한 크기만큼 할당해주어야 한다.

- 우리가 원하는 만큼만 메모리를 할당해서 사용하고자 한다면 동적 메모리 할당을 사용한다.

- 동적이라는 말의 의미는 '프로그램 실행 도중에' 라는 의미이다.

 

- 동적메모리 할당을 수행할 때마다 할당되는 포인터의 주소는 변칙적이다.

- 동적으로 할당된 변수는 <힙 영역>에 저장된다.

 

<동적 메모리 할당 함수>

1) C언어에서는 malloc() 함수를 이용해 원하는 만큼의 메모리 공간을 확보할 수 있다.

2) malloc() 함수는 메모리 할당에 성공하면 주소를 반환하고, 그렇지 않으면 NULL을 반환한다.

3) malloc() 함수는 <stdlib.h>라이브러리에 정의되어 있다.

ex) malloc(할당할 바이트 크기);

 

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

int main(void){
    int *a = malloc(sizeof(int)); //int는 4바이트기 때문에 malloc(4)와 같다.
    printf("%d\n", a);
    a = malloc(sizeof(int));
    printf("%d\n", a);
    system("pause");
    return 0;
}

//출력값 두개 다 같게 나왔음, 하지만 매번 실행 할 때마다 다른 주소값이 할당 될 수 있으므로 변칙적이다.

 

- 전통적인 C언어에서는 스택에 선언된 변수는 따로 메모리 해제를 해주지 않아도 된다.

- 반면에 동적으로 할당된 변수는 반드시 free()함수로 메모리 해제를 해주어야한다.

- 메모리 해제를 하지 않으면 메모리 내의 프로세스 무게가 더해져 언젠가는 오류가 발생한다.

- 메모리 누수(Memory Leak) 방지는 코어개발가의 핵심 역량이다.

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

int main(void){
    int *a = malloc(sizeof(int)); //int는 4바이트기 때문에 malloc(4)와 같다.
    printf("%d\n", a);
    free(a); //메모리 할당 해재해줌
    a = malloc(sizeof(int));
    printf("%d\n", a);
    free(a);//메모리 할당 해재해줌
    system("pause");
    return 0;
}
// 메모리 할당을 해제해줬기 때문에 웬만하면 두 print문에서 동일한 주소값이 출력될 것이다.
// 왜냐하면 첫번째 a는 할당 해제 뒤 메모리가 비어있고 바로 다음 줄에서 메모리 할당을 해줄 확률이 높기 때문이다.

 

 

<동적 문자열 처리하기>

- 일괄적인 범위의 메모리를 모두 특정한 값으로 설정하기 위해서는 memset()을 사용한다.

- memset(포인터, 값, 크기);

- 한 바이트씩 값을 저장하므로 문자열 배열의 처리 방식과 흡사하다.

- 따라서 memset() 함수는 <string.h> 라이브러리에 선언되어 있다.

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

int main(void){
    char *a = malloc(100); //100바이트 할당
    memset(a, 'A', 100);
    for(int i=0; i<100; i+){
        printf("%c",a[i]);
    }
    system("pause");
    return 0;
}
// A가 100개 출력된다.

 

 

- 동적 메모리 할당의 예제

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

int main(void){
    int **p = (int**)malloc(sizeof(int*) * 3);
    for (int i=0; i<3; i++){
        *(p+i) = (int*)malloc(suzeof(int)*3);
    }
    for (int i=0; i<3; i++){
        for (int j=0; j<3; j++){
            *(*(p+i)+j) = i*3+j;
        }
    }
    for (int i=0; i<3; i++){
        for (int j=0; j<3; j++){
            printf("%d",*(*(p+i)+j));
        }
        printf("\n")
    }
    system("pause");
    return 0;
}
// 0 1 2
// 3 4 5
// 6 7 8
// 형태로 출력된다.

'컴퓨터 기본 개념' 카테고리의 다른 글

17장. 구조체  (0) 2020.07.30
14장. 다차원 배열과 포인터 배열  (0) 2020.07.29
35강. 깊이 우선 탐색  (0) 2020.07.28
자료구조와 알고리즘 - 그래프 개념과 구현  (0) 2020.07.27
33강. 탐색-순차 탐색과 이진 탐색  (0) 2020.07.27
    '컴퓨터 기본 개념' 카테고리의 다른 글
    • 17장. 구조체
    • 14장. 다차원 배열과 포인터 배열
    • 35강. 깊이 우선 탐색
    • 자료구조와 알고리즘 - 그래프 개념과 구현
    happyso
    happyso

    티스토리툴바