[완료] C에서 포인터 정의를 하면 자꾸 0x0에 배치됩니다.
글쓴이: k333ps / 작성시간: 월, 2012/07/30 - 8:38오후
C로 프로그램을 짜고 있습니다만 자꾸 세그먼트 폴트가 나서 gdb로 디버깅을 해본 결과
특정 영역의 포인터 변수들이 자꾸 0x0을 가르킵니다. 예를 들어
int f( blah blah )
{
...
double *up;
g( up );
}
의 경우 up이 0x0을 가르키기 때문에 g함수가 실행되며 세그먼트 폴트가 일어나는 식입니다.
f안에서 거대한 배열 double *x = malloc(sizeof(double)*1000000); 등을 여러개 사용하고 있습니다만 이것과 혹시 관계가 있을까요?
double x[1000000]을 쓰면 스택오버플로우가 일어나기 때문에 힙으로 옮겼습니다만 그렇게해도 이러한 세그먼트 폴트가 일어나는 원인은
무엇인지요.
감사합니다.
Forums:
메모리 용량 부족등으로 malloc()이 실패하면
메모리 용량 부족등으로 malloc()이 실패하면 NULL(0x0) 을 가리키게 됩니다.
alloc을 많이 받으신다면 받을때마다 NULL 여부를 검사하셔야 합니다.
관련 스레드입니다.
google에서 "malloc return" 쳤더니 나오네요.
planetarium님의 말처럼 메모리 용량부족으로 보이네요~ : )
http://kldp.org/node/49572
흘러가고있는 지금 이 시간에 충실하자.
감사합니다!
조금은 실마리가 잡힐 거 같네요.
스택의 경우는 ulimit -a로 크기를 알 수 있었습니다만
malloc() 잡은 메모리는 힙에 할당된다고 들었는데 힙의 메모리크기는 어떻게 알 수 있나요?
sizeof(double)*1000000를
sizeof(double)*1000000를 여러번이라고 하셨는데, 그 여러번이 구체적으로 몇번인가요?
sizeof(double)*1000000 한번에 대충 8MB의 메모리가 필요하므로 100번만 할당해도 800MB정도의 메모리가 필요합니다.
실행중에 시스템 메모리가 고갈되지 않았나 확인해보세요.
댓글 달기