2014-09-26 1 views
0

프로그램에서 문제가 발생하여이를 해결하는 방법을 모르겠습니다. 파일을 처리하고 있으므로 ftell로 크기를 가져 와서 M_size에 저장합니다. 그 후 N으로 부호없는 char 포인터 배열을 선언합니다.이 배열은 두 개의 함수 a()와 b()에서 사용됩니다. 실제로 for 루프 ptr_M의 각 요소를 초기화()큰 포인터 배열을 선언하는 동안 C에서 세분화 오류가 발생했습니다.

... 
unsigned long N = (M_size/ x); 
int LstElemSize = M_size % x; 
if(LstElemSize != 0){ 
    N += 1; 
}  
unsigned char *ptr_M[N] 
a(ptr_M) 
b(ptr_M) 
... 

기능 A :

a(){ 
    int i; 
    for(i = 0; i < N-1; i ++){ 
    ptr_M[i] = malloc(sizeof(unsigned char) * x); 
    } 
} 

기능 B()을 반복 한 후 각 위에 소자 및 물건을 계산하고, 마지막에 각각의 요소가 해제된다.

내 문제는 이제 파일을 처리하려고 할 때입니다. 1 GB 배열 크기는 약 4 000 000이 될 것이고 분할 오류가 발생합니다 (줄에서 내 배열 선언). 8 바이트 (문자 포인터) 시간 4 000 000 = 32MB 올바르게 계산했다면. 프로그램을 실행하는 서버에 파일을 저장할 충분한 메모리가 있지만 Response 1에서 언급했듯이 스택 공간이 충분하지 않습니다.

내 문제를 해결하려면 어떻게해야합니까? 스택 공간 늘리시겠습니까? 감사!

+0

스택에 32MB 어레이를 만들려고합니까? 스택은 일반적으로 단일 숫자 MB 범위에 있으며 VC++를 사용하는 Windows에서는 기본값이 1MB입니다. –

답변

1

작은 크기 제한이있는 스택에 ptr_M을 정의하는 것이 문제입니다. 힙에는 크기 제한이 없으므로 시스템의 메모리를 더 많이 사용할 수 있습니다. 서브 배열을 할당하는 것처럼 malloc()을 사용하여 ptr_M을 할당해야합니다. (모든 하위 어레이와도 함께 어떤 시점에서 그것을 해제해야합니다!) 또한

unsigned char **ptr_M = malloc(sizeof(unsigned char*) * N); 

, 당신의 a()는 off-by-one 오류가 있습니다. 배열의 마지막 항목을 무시합니다. 이것을 사용하십시오 :

for(i = 0; i < N; i ++){ 
+1

당신은 off-by-one 오류에 대해 옳았습니다. 그러나 실제로 저는 마지막 요소를 가지고 뭔가 다른 것을하고 있습니다. 그러나 어떤 문맥도없이 당신은 절대적으로 옳습니다! –

0

malloc은 스택이 아닌 힙에서 공간을 할당합니다. heapsize를 늘려 컴파일러 옵션을 살펴보십시오. 거기에서 지원되는 heapsize의 상한을 확인하십시오.

0

unsigned char *ptr_M[N]은 인데, unsigned char을 스택에 넣으면됩니다. 배열의 공간도 동적으로 할당해야합니다.

+0

나는 이것도 자유로운 힌트를 위해 upvote 것이다. 그러나 나는 할 수 없다. 다른 누군가가 그것을하기를 희망합니다! 감사! –

관련 문제