2017-10-04 4 views
0

통계 알고리즘을 사용하여 계속 세분화 오류가 발생했으며 계속 볼 수 없습니다. 나는 꽤 정확하게 calloc'd 메모리를 가지고 있다고 확신한다. 루프의 반복을 몇 번 수행 한 후에 만 ​​오류가 발생하기 때문에 언더 플로우와 관련이 있는지 궁금합니다. 아래 코드는 내 printf과 함께 디버깅 용입니다. 미안 구문이 약간 혼란 스러울 경우 저널 간행물을 따라 가고 있습니다. 다음알고리즘의 작은 숫자로 작업 할 때 예기치 않은 세그먼트 오류가 발생했습니다.

// *** n and m defined previously 
float *aux_arr = calloc(n, sizeof(float)); 
if (aux_arr == NULL) { 
    printf("calloc failed"); 
} 

int j; 
int j0 = 1; 
int j1 = 1; 
aux_arr[1] = 1; 

for (size_t i = 0; i < n - 1; i++) { 
    printf("\nOUTER\n"); 
    j1 += 1; 
    printf("i: %zu\n", i); 
    printf("j1: %i\n", j1); 

    for (j = j1; j >= j0; j--) { 
     printf("\nINNER\n"); 
     printf("j: %i\n", j); 
     printf("j1: %i\n", j1); 
     printf("j0: %i\n", j0); 

     // print first 5 elements of my aux_arr 
     for (int i = 0; i < 5; i++) { 
      printf("%f\n", aux_arr[i]); 
     } 

     aux_arr[j] = (j/m) * (aux_arr[j]) + (1 + (1/m) - (j/m)) * (aux_arr[j - 1]); 


     if (aux_arr[j] < (1.0 * pow(10, -20))) { 
      aux_arr = 0; 
      if (j == j1) { 
       j1 -= -1; 
      } 
      if (j == j0) { 
       j0 += 1; 
      } 
     } 
    } 
} 

출력 :

OUTER 
i: 0 
j1: 2 

INNER 
j: 2 
j1: 2 
j0: 1 
0.000000 
1.000000 
0.000000 
0.000000 
0.000000 

INNER 
j: 1 
j1: 2 
j0: 1 
0.000000 
1.000000 
1.000000 
0.000000 
0.000000 

OUTER 
i: 1 
j1: 3 

INNER 
j: 3 
j1: 3 
j0: 2 
Segmentation fault: 11 

당신은 내가 액세스하려고 할 때 문제가 오는 것을 볼 수 있습니다 내 aux_arr 세 번째 시간. 처음 2 번 제대로 작동하는 이유는 확실하지 않습니다.

감사합니다.

+0

디버거에서 코드를 밟았습니까? 그것은 할 첫 번째 일입니다. – OldProgrammer

+1

샘플 코드를 복사하여 붙여 넣고 컴파일하고 실행할 수있는 [전체 프로그램] (https://stackoverflow.com/help/mcve)으로 확장 할 수 있습니까? –

+0

외부 루프에서 반복 변수로 'i'를 사용하고 처음 5 개 요소를 인쇄하는 루프를 사용하는 것이 혼란 스럽습니다. – Barmar

답변

2
aux_arr = 0; 

그게 당신의 범인입니다. aux_array을 널 포인터로 설정하면 다음 액세스가 유효하지 않습니다.

+0

잘 보였습니다 :-) 아마도'aux_arr [j] = 0'이 의도 된 것일 수도 있습니다. – 4386427

+0

실제로 그것은 aux_arr [j] = 0'으로되어있었습니다. 아주 간단하지만 아직 나는 그것을 볼 수 없었다. – Davigor