2014-12-09 11 views
-1

Saper of Eratosthenes를 사용하여 SPOJ의 PRIME1 문제를 해결하려고합니다. 코드는 아래의 정수에 대해 잘 작동하지만 오랫동안의 int에 대한 다음과 같은 오류 표시 -"액세스 위반"이 오류를 해결할 수 없습니다.

"spoj1.exe에서 0x770d15ee에서 처리되지 않은 예외 :.가 0xc0000005 : 액세스 위반 쓰기 위치 0x0014010c을"

문제를 해결하는 데 도움을주십시오. 또한 나는 코딩에 익숙하지 않기 때문에 내가 만든 모든 실수를 참아주십시오.

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int m, n, test, i, k; 
    long int *arr, p; 

    scanf("%d", &test); 

    while (test--) 
    { 
     scanf("%d%d", &m, &n); 

     arr = (long int *)calloc(n - 1, sizeof(long int)); 

     if (m == 1) 
     { 
      m = 2; 
     } 
     arr[0] = 2; 

     for (i = 1; i < n - 1; i++) 
     { 
      arr[i] = arr[i - 1] + 1; 
      // printf("%d\n",arr[i]); 
     } 

     for (i = 0; i < n - 1; i++) 
     { 
      if (arr[i] != 0) 
      { 
       for (k = arr[i] - 2; k < n - 1;) 
       { 
        k = k + arr[i]; 
        arr[k] = 0; 
       } 
      } 
     } 

     for (i = 0; i < n - 1; i++) 
     { 
      if (arr[i] != 0 && arr[i] >= m) 
      { 
       printf("%d\n", arr[i]); 
      } 
     } 

     printf("\n"); 
    } 

    free(arr); 
    return 0; 
} 

편집

예 -

여기 내 코드입니다. k = k + arr[i]이 버그를 생성하고있었습니다. 고맙습니다. 하지만 여전히 큰 숫자에 대해서는 오류가 발생합니다. 예 - m = 100000000n = 110000000에 대해 코드가 제대로 실행되지만 m = 999899999n = 999999999에 대해 다음 오류가 표시됩니다. 오류는 - "spoj1.exe의 0x778a15ee에서 처리되지 않은 예외 : 0xC0000005 : 0x00000000 위치에 액세스 위반이 발생했습니다." 변경된 코드는 -이 코드 블록에서

for(k = arr[i]-2; k<n-1;) 
    { 
     k = k + arr[i]; 
     if(k < n-1) 
     { 
      arr[k] = 0; 
     } 
+1

'calloc()'에'k = k + arr [i];' – Himanshu

+1

이라는 줄이 있는데,'n <= 1'이면 어떻게 될까요? 또한, 성공을 확인 했습니까? –

+1

디버거에서 코드를 실행하십시오. –

답변

0

:

for (i = 0; i < n - 1; i++) 
{ 
    if (arr[i] != 0) 
    { 
     for (k = arr[i] - 2; k < n - 1;) 
     { 
      k = k + arr[i]; 
      arr[k] = 0; // <-- this line can/will access an element of arr[] 
          //  that is beyond the bounds of the arr[] array 
          //  remembering that arr[] only contains n-1 elements 
          //  therefore the max offset is m-2 
          //  so, when 'k' gets to be >= n-1 
          //  then arr[k] is accessing an element 
          //  beyond the end of arr[] 
     } 
    } 
} 

내부 forarr[] 루프의 경계를 초과 할 수있다. 이것은 kn-2

+0

예. "k = k + arr [i]"가 버그를 생성하고있었습니다. 고맙습니다. 하지만 여전히 큰 숫자에 대해서는 오류가 발생합니다. 예 - m = 100000000 및 n = 110000000에 대해 코드가 올바르게 실행되지만 m = 999899999 및 n = 999999999에 대해 다음 오류가 표시됩니다. 오류는 - 입니다. "spoj1에서 0x778a15ee의 처리되지 않은 예외입니다.. EXE :가 0xc0000005 : 액세스 위반 기록 위치를 0x00000000 " 수정 코드는 - 대 (k 값 =에 도착 [I] -2] K learntocode

0

보다 큰 경우에 발생합니다. 또한 답변을 얻은 후에는 해제가 올바르지 않습니다. 먼저 while 루프의 반복이 여러 번 발생하면 메모리 누수가 발생할 수 있습니다 (arr은 calloc에 ​​대한 새 호출로 덮어 쓰여지고 결코 해제되지 않습니다). 또한 while 루프가 0 번 발생하면 초기화되지 않았기 때문에 가비지를 포함하는 포인터를 해제합니다. while 루프 안에 free으로 전화를 걸거나 모든 값을 arr으로 저장하고 마지막에 적절한 확인을해야합니다.