[완료]c언어에서 배열 크기 관련
글쓴이: k333ps / 작성시간: 토, 2012/07/21 - 3:21오후
안녕하세요. c언어로 큰 배열을 사용하려합니다만 알 수 없는 에러가 나 이렇게 질문을 올립니다.
아래의 소스코드를 예로 들면
#include <stdio.h> #include <math.h> #define IMAX 1000000 #define JMAX 2000 #define ZMAX 2 int main(void) { int JLS[ZMAX]; int IGS[JMAX]; double Y[JMAX]; double X[IMAX]; double F[IMAX]; int i,j,k; for (i = 0; i < IMAX; i++){ IGS[i] = 0; F[i] = 0; X[i] = 0; } return 0; }
이 소스를 gcc로 컴파일해 실행할 경우 segmentation fault가 납니다.
gdb로 디버깅해본 결과 F배열에의 메모리 접근이 불가능하다고 나오는데요.
IMAX의 크기를 좀 줄여보면 좀 나은 결과를 내 줍니다 (얼마 안가 다른곳에서 다시 에러를 내지만요...)
이상을 종합해보면 함수의 크기를 크게 잡아서 오류가 나는것 같은데
c언어에서는 배열의 크기에 대한 실질적인 제한이 있는지요?
Forums:
배열의 크기가 제한이 있다기 보다... 함수의
배열의 크기가 제한이 있다기 보다...
함수의 스택영역 변수 그러니까 지역변수를 너무 크게 잡으면 깨집니다.
int *IGS = malloc(sizeof(int) * IMAX);
식으로 바꾸면 아무런 문제가 없을겁니다.
포인터로 선언했지만 걍 배열인거처럼 []사용하면 되고
물론 free는 해줘야 겠죠.
감사합니다!
말씀해주신대로 바꿔보니 프로그램이 잘 돌아가게 되었어요.
조금 알아보니 int IGS[IMAX]; 의 경우는 스택을,
int *IGS = malloc(sizeof(int) * IMAX); 의 경우에는 힙을 사용하게 된다고 하는것 같던데
둘에는 어떤 차이가 있는지 조금 자세하게 설명해 주실 수 있으신지요.
메모리는 크게 데이터영역, 스택영역, 힙영역 이렇게
메모리는 크게
데이터영역, 스택영역, 힙영역
이렇게 3개로 나뉘어지게 되는데
데이터영역에는 지역변수나 static 으로 선언한 변수들이 저장되고
스택영역은 프로그램이 컴파일될때 크기가 결정되는 요소들이 저장되용
함수를 호출할때 돌아올 지점도 이곳에 저장이 되고 지역변수들도 요기에 저장되죠
이 스택영역은 컴파일될때 메모리에 잡히고 종료될때 자동으로 해제되는데비해
힙영역이라는 곳에 있는 메모리들은 컴파일될때가아니고
컴파일되고 실행될때 즉 런타임때 메모리에 잡히고
프로그램이 종료되도 자동으로 해제가 안되고 사용자가 해제를 해줘야 하지용
첫번째 답변자깨서 마지막에 free를 해줘야한다는건
이 힙영역에 잡힌 메모리를 사람이 직접 해제해야 한다는걸 의미하구여
즉
질문자께서 물어보신 malloc 은 힙을 사용하는거에대해 설명을 요청하셨는데
c의 malloc 계열이나 c++의 new 연산자 같은경우는 메모리를 지역변수의 스택이아닌
힙영역에 할당하겠다고 선언하는 것이지요
힙영역은 잡혔던 메모리가 프로그램 종료시 자동으로 해제가 안되는 영역이기때문에
프로그래머가 직접 종료전에 free를 해줘야하는거구여..
설명 감사합니다.
더욱 이해가 깊어진 것 같습니다.
그러면 힙 영역에 저장했을 경우엔 변수의 크기가 아무리 커도 상관이 없는 건가요?
스택의 경우 변수의 크기가 제한 했던 것 이상으로 커지면 스택오버플로우가 일어납니다만
힙의 경우엔 아무리 변수가 커도 물리적 용량 보다 작으면 괜찮은지요.
비슷한 것이 있는지 궁금합니다.
힙에 남아있는 공간의 총량이 충분하다 하더라도
힙에 남아있는 공간의 총량이 충분하다 하더라도 malloc/new에 실패할 수가 있습니다. 메모리 파편화가 심할 때 그렇습니다. 예를 들어 10바이트의 메모리가 남아 있다고 하더라도, 여유 공간이 5바이트짜리 공간 두 개로 쪼개져 있다면 5바이트보다 큰 변수를 할당할 수는 없겠죠.
요즘 OS는 프로그램 종료 시에 메모리를 수거합니다.
요즘 OS는 프로그램 종료 시에 메모리를 수거합니다. 적어도 리눅스와 윈도는 힙 영역 메모리도 수거해가죠. 그렇더라도 모든 OS가 다 그런 건 아니니 직접 free/delete 하는 건 좋은 습관입니다.
댓글 달기