함수 내부에 사이즈가 큰 배열선언

 이번에 알고리즘 문제를 풀면서 직면했던 문제인데, 코드를 아무리 실행해도 실행되지 않았다. 이유를 찾아본 결과 함수 내부에 너무 큰 크기의 배열을 선언했기 때문인데, 지속적으로 함수가 호출되면서 큰 사이즈의 배열의 메모리가 다시 재할당되는 것이 성능에 문제를 주기 때문이다. 그렇기에 내가 사용한 IDE는 Visual Studio였는데, 함수안에 큰 사이즈의 배열이 선언되면 컴파일러가 프로그램이 실행되지 않도록 한다. 이 문제는 main함수에서도 똑같이 적용된다. 

 

C 프로그래밍 입문/데이터 배열 - 위키책

데이터 배열[+/-] 서너 개의 데이터를 다룰 때엔 변수를 이용하면 충분히 데이터를 저장하거나 관리하는 것이 가능하지만 수십~수백의 데이터를 다룬다던가, 수천~수만의 데이터를 다룰때는 변

ko.wikibooks.org

참고할 부분

 함수 내에서 선언되어 사용되는 배열의 경우 배열 자체가 스택 영역에 생성되고, 함수가 호출될 때 마다 해당 배열을 위한 메모리를 새로 생성하고 초기화 하는 작업을 하기 때문에 배열의 크기가 큰 경우에는 다른 방법을 사용해야 한다. 

+추가설명

 함수가 호출될 때 마다 해당 배열을 위한 메모리를 생성하고 초기화 한다고 했는데, 함수안에서 작성된 내용들은 함수가 끝날 때는 값이 다 사라지기 때문에 함수가 호출될 때 마다 해당 지역변수 배열을 위한 메모리를 생성하고 초기화 한다는 뜻이다.

 

함수 내에서 크기가 큰 배열을 생성하는 경우 다음과 같은 문제점을 일으킬 수 있다:

 1. 배열을 초기화 하는 경우 함수가 호출될 때 마다 값을 채워넣어야 하기 때문에 프로그램의 수행 속도가 느려질 수 있다. 특히나 자주 호출되는 함수인 경우에는 프로그램의 속도를 치명적으로 느리게 만들 수 도 있다.

 

 2. 이론적으로 스택 지역 자동변수가 저장되는 영역의 크기는 제한되지 않지만, 시스템에 따라 하드웨어적인 제한이나 스택 운영의 효율을 높이기 위해 스택의 크기를 제한하기도 한다. 그렇기 때문에 함수 내에서 선언되는 배열의 크기가 과도하게 큰 경우 스택 오버플로우 에러가 발생하고 프로그램이 강제 종료 될 수 도 있다.

 

 3. 컴파일러의 종류나 옵션에 따라서는 컴파일된 프로그램의 크기가 커질 수도 있다.


그렇기 때문에 배열의 크기가 조금이라도 크다는 느낌이 든다면 다른 메모리 영역을 사용하는 것을 고려해 볼 필요가 있다:

 1. 스태틱 영역을 사용하는 변수 - 전역 변수나 스태틱 변수를 사용한다.

 2. alloc() 계열의 함수를 이용하여 힙영역을 할당하여 사용한다.

'C,C++' 카테고리의 다른 글

[C++] 상수와 포인터  (0) 2023.01.24
C언어 string.h 문자열 관련 함수 정리  (0) 2021.01.09
C언어 표준함수 확인  (0) 2021.01.09
[C언어] 배열을 초과해서 데이터 삽입  (0) 2021.01.07