2017-03-15 1 views
1

이 짧은 프로그램을 실행할 때 "스레드 1 : EXC_BAD_ACCESS (코드 1)"오류가 발생합니다. 문제의 원인을 파악하는 데 도움을 줄 수 있습니까?스레드 1 : EXC_BAD_ACCESS (코드 1) 오류

//populates matrix with rand nums 
void popMat(int x[][4096]){ 
for(int i = 0; i < 4096; i++){ 
    for(int j = 0; j < 4096; j++){ 
     x[i][j] = rand() % 100; 
    } 
} 
return; 
} 

int main(int argc, char * argv[]) { 

int mat1 [4096][4096]; 
int mat2 [4096][4096]; 

popMat(mat1); 
popMat(mat2); 

for(int i = 0; i < 4096; i++){ 
    for(int h = 0; h < 4096; h++){ 
     printf("%d, %d\n", i, h); 
    } 

} 

return 0; 
} 
+0

디버거에서 알려주는 것은 무엇입니까? 라인 오류, 스택 추적, 스택 포인터 등이 발생합니까? 그러면 문제를 발견하는 데 도움이됩니다. – CRD

답변

2

4 바이트 정수를 가정 할 때, int mat1 [4096][4096];은 64MB의 메모리가 필요합니다. 이러한 두 개의 어레이에는 128MB의 메모리가 필요합니다. 로컬 변수가 생성되는 대부분의 시스템 스택 메모리에서는 그러한 큰 메모리를 저장할 수 없으며 스택 오버플로가 발생합니다.

하나의 쉬운 솔루션은 배열을 전역 범위로 이동하는 것입니다 (전역을 사용하는 것이 좋습니다). 다른 해결책은 malloc 또는 new을 사용하여 이러한 배열을 동적으로 할당하는 것입니다. 다른 해결책은 정적으로 할당 된 C 배열 대신 std::vector을 사용하는 것입니다.

PS : 당신이 동적으로 할당하기로 결정한 경우

  • 메모리를 해제하는 것을 잊지 마십시오.
  • 이 문제를 해결 한 후에도 은 항상 srand()이 호출되지 않은 것과 동일한 값을 생성한다는 것을 알 수 있습니다.
관련 문제