프로그래밍/C,C++

동적으로 할당되는 배열

Hithero 2018. 9. 24. 09:53

동적할당?

C언어에서 동적할당하는 영역이 따로 있다. = Heap 영역

이부분은 사용자가 할당하는 메모리영역이라서 할당과 해제를 사용자가 해줘야된다.

ex) int *a = (int*)malloc(sizeof(int)*length);, 한 후에는 free(a) 를 필수로 해야된다.

하지 않을 경우, 작은 프로그램의 경우는 영향이 덜하지만, 동적할당으로 힙영역에 많이 할당하게 되는 프로그램의 경우는 뒤에 가서는 메모리 할당 영역이 부족하게 되어 프로그램이 멈추는 상황이 생긴다.

그 것이 아니더라도 free 하지않으면 코드를 돌리는 데 원치 않는 값이 나오는 경우도 생긴다 ( 이유는 모르겠다. 경험상..)

왜?

이건 그냥 경험상인데 시스템 프로그래밍 할 때 많이 쓰이게 되는 것같다. 

int a[1000000],b[100000],c[10000] 과 같이 큰 영역에 메모리 '정적'할당을 여러번하고 배열에서 원하는 값을 출력하는 실습이 있었는데, 계속 이상한 값이 출력되는 상황이 있었다. 그런데 코드 바꾸지않고, 저 변수들만 다 동적할당하여 실행을 하니 값이 제대로 출력되는 게 어이가 없었다. 정적 할당과 동적할당의 차이라고 짐작하고 있을 뿐이다..

어플리케이션만들거나 코딩대회에서는 동적할당을 쓸 일이 전혀없다고 한다.

사용법

#include <stdlib.h>을 해주어야 된다.

1차원 배열의 경우 (길이 length)

malloc - heap 영역에 공간 할당

int *a = (int*)malloc(sizeof(int)*length);

calloc  할당된 공간의 값을 모두 0으로 초기화한다.

int *a = (int*)calloc(length, sizeof(int));

realloc - 이미 할당된 공간의 크기 변경

int *a = (int*)malloc(sizeof(int)*length); 로 되어있는 할당 영역을

realloc(a,sizeof(int)*100);  - a의 메모리를 100*4 바이트 재 할당


-> char 형이면 int 대신 char을 넣으면 된다.

2차원 배열의 경우 (m x n)

int ** a = (int**)malloc(sizeof(int*)*m);
for(int i=0; i <n; i++){
a[i] = (int*)malloc(sizeof(int)*n);
}



추후 의문점

1. free 하지 않으면 원치 않는 값이 나오는 경우, 그 이유

2. '왜?' 에서 나오는 정적 할당과 동적할당의 차이



728x90
반응형

'프로그래밍 > C,C++' 카테고리의 다른 글

[C] scanf 공백포함 입력받기( '\n' 까지 받기)  (0) 2020.02.04
배열 scanf 로 입력받기  (0) 2019.05.18