2013-02-18 2 views
0

해결할 수없는 매우 이상한 버그가 있습니다. 내가 엑스 코드 (이 문제 있는지 확실하지 않습니다)에 그것을 실행하고clock() 함수에서 EXC_BAD_ACCESS 오류가 발생했습니다.

clock_t start, diff; 
start = clock(); 
const int N = 1000; 
int a[N][N]; 

for(int i=0 ; i<N ; ++i){ 
    for(int j=0 ; j<N ; ++j) 
     a[j][i] = 0; 
} 

diff = clock()-start; 
int msec = (int) diff*1000/CLOCKS_PER_SEC; 
printf("time: %d milliseconds", msec); 

코드의 간단한 조각을 시간이 간단한 프로그램을 구축하고 그것을 잘 실행하지만 2000 N을 변경할 때 나는 EXC_BAD_ACCESS (코드를 얻을 2, address = 0xfff5ecbd438)을 start = clock() 행에 입력하십시오.

배열 크기를 변경하면 clock() 명령에 어떤 영향을 주는지 잘 모르므로 여기를 놓치고 있습니다.

아이디어가 있으십니까?

+0

IOS 또는 Mac에 있나요? 배열 'a'가 4 * 1000 * 1000 = ~ 4MB의 스택을 차지한다는 것을 알고 있습니까? – JBRWilkinson

답변

2

대단히 큰 배열을 로컬 변수로 할당하려고 시도했을 때 스택을 날려 버렸을 가능성이 큽니다.

2000 * 2000 * sizeof (int)는 16MB 이상일 수 있습니다.

배열이 바로 뒤에 선언되고 그 때 스택 할당이 발생하기 때문에 그 시점에서 충돌이 발생합니다.

전역 및/또는 정적으로 배열을 스택 밖으로 옮길 수 있지만 약간 해킹이 될 수 있으며 메모리를 올바르게 할당하고 관리하는 std :: vector를 사용하는 것이 좋습니다.

+0

감사합니다. 정보가없는 오류 메시지는 정말로 나를 벗어나게합니다 ... – ethanf

0

오류와 관련하여 도움이 될 수 있습니다. EXC_BAD_ACCESS는 잘못된 포인터에 액세스하려고한다는 것을 의미합니다.

관련 문제