2014-05-12 3 views
-1

Linux에서 gcc를 컴파일러로 사용하면 악명 높은 코어 덤프 오류가 발생합니다. 글로벌 선언 :세그먼트 오류 : 코어가 큰 크기의 배열을 초기화하는 동안 덤프되었습니다.

오류가 발생
#define MAX_N 10000 


double cost[MAX_N][MAX_N]={0}; 
int stack[MAX_N]; 
int visited[MAX_N]; 

(나는이 라인을 주석 처리하면 도망 간다) :

for(q=0;q<5;++q) 
    { 
     visited[q]=0; 
     stack[q]=0; 
    } 

이 코드 조각이 호출되는 함수 내부에있다 10,000의 수를 타임스. 그래서 함수가 호출 될 때마다,이 초기화가 완료되어야합니다! 내가 memset을 사용하여 시도했지만 너무 도움이되지 않습니다!

+1

오류가 발생하는 곳은 아닙니다 .. 행을 주석 처리하면 다른 코드가 손상되는 원인이 변경 될 수 있습니다. –

+0

10000은 큰 크기가 아닙니다. 분명히 그 오류는 다른 곳에서 발생합니다. 이러한 종류의 오류가 발생하면 원점에서 멀리 떨어지는 오류가 발생하는 것이 정상입니다. – ivg

+0

그러면 정확히 어떻게 오류가 발생했는지 추적 할 수 있습니까? –

답변

1

내 생각 엔 : 실제로 큰 크기

10000, @ivg의 말씀에도 불구하고. 귀하의 선언은 적어도 760Mb 걸릴 것이며, 이것은 특히 런타임에 스택 크기를 늘릴 때 (특히 함수 내에서 함수를 호출 할 때 일반적으로하는 일) 하드 제한과 쉽게 닿을 수 있습니다.

나는 그 선언을 힙 메모리 공간 (malloc/free를 호출)으로 옮기려고한다.

0

스택 오버플로가있을 수 있습니다. 종종 이것은 현명한 증상이 없으며 기괴한 사고가 발생합니다. 시도해야 할 가장 분명한 것은 큰 배열을 static으로 만들거나 대신 동적 할당을 사용하는 것입니다.

+0

게시 된 코드에서 알 수 있듯이 배열에는 이미 정적 저장 기간이 있습니다. – Lundin

+0

그는이 코드 조각이 함수 안에 있다고 말했다. –

+0

배열이 함수 내에서 선언되었는지 또는 루프 스 니펫에서만 선언되었는지 확실하지 않다고 생각합니다. 여하튼,'정적'은 문제를 해결하지 못한다. 다른 곳으로 옮기면된다. 동적 할당 만 올바른 해결책입니다. – Lundin

1

이러한 배열이 파일 범위에서 선언 된 경우 정적 저장 기간을 가지며 .bss 세그먼트에 저장됩니다.

이러한 배열이 로컬 범위에서 선언되면 스택에 저장됩니다.

두 경우 모두 주어진 시스템의 .bss 또는 스택의 최대 한도를 초과 할 수있는 극도의 메모리를 사용하고 있습니다.

가정 sizeof(double) == 8sizeof(int) == 4는, 당신은 공간의 대략 780Mb

(8 * 10000 * 10000) + (4 * 10000) + (4 * 10000) = 800,080,000 bytes 

을 할당했다.

이와 같이 많은 양의 메모리가 힙에 할당되어야합니다.