2015-05-09 2 views
0

Пожалуйста, взгляните на этот код на C. Это небольшая программа, которую я написал, которая принимает число n в качестве входных данных и вычисляет все простые числа от 2 до n. Он отлично работает, когда n < 100, но если я ставлю 1000 или более, он сработает. Я не могу понять, почему, поскольку массив, в котором хранятся числа, динамически распределяется, поэтому недостаток памяти не должен быть проблемой.Сбой программы на больших входах (C)

Итак, почему программа сбой на больших входах?

Кроме того, я прошу прощения за плохое считывание кода. Я только начинаю программировать.

код

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

int main() 
{ 
    int i; 
    int n; 
    int *array = malloc((n-1)*sizeof array); 
    int q = 0; 
    int k; 
    int *array2; 

    printf("Geben Sie eine natuerliche Zahl n ein: "); 
    scanf("%d", &n); 
    printf("\n"); 

    for(i=0; i<=n-2; i++){ 
     array[i] = i+2; 
    } 

    while(q<=n-2){ 
     while(array[q]==0&&q<=n-2){ 
      q++; 
     } 
     for(i=q+1; i<=n-2; i++){ 
      if(array[i]%array[q]==0){ 
       array[i] = 0; 
      } 
     } 
     q++; 
    } 

    PART1: 
    for(i=0; array[i]!=0; i++){ 
     if(array[i+1]==0){ 
      int j; 
      for(j=i+1; j<=n-2; j++){ 
       if(array[j]!=0){ 
        array[i+1] = array[j]; 
        array[j] = 0; 
        goto PART1; 
       } 
      } 
      k = i; 
      goto PART2; 
     } 
    } 

    PART2: 
    *array2 = malloc((k+1)*sizeof array2); 

    for(i=0; i<=k; i++){ 
     array2[i]=array[i]; //Here's where the program crashes 
    } 

    free(array); 

    for(i=0; i<k; i++){ 
     printf("%d ,", array2[i]); 
    } 

    printf("%d\n\n", array2[k]); 

    free(array2); 
    return 0; 
} 

CodeBlocks отладчик говорит: программа получила сигнал SIGSEGV, сбой сегментации, в строке 53. Я отметил его в коде.

+0

Какая авария? Вы пробовали отладчик, чтобы точно определить, где/как он сбой? –

+2

используйте gdb, чтобы увидеть, где он падает, и опубликуйте это. одна проблема: вы являетесь «распределением массива на основе (неопределенного n)» перед сканированием f для n. аналогично, содержимое массива не определено в вашем первом цикле. – amdixon

+0

codeblocks debugger говорит: запрограммированный сигнал SIGSEGV, ошибка сегментации в строке 53. Я пометил его в коде. Но я не знаю, что это значит. – Arthur

ответ

2

процесс, чтобы исправить

  • использовать отладчик (всегда), чтобы найти линию вызывая Segfault
  • исследование обижая переменных, участвующих

В этом случае линия 53 имела в виду a array2 доступ, который был неправильно назначен ..

изменения требуется

  • распределения перемещения по array1 после зсапа должным образом назначенных п
  • изменений при распределении массив2, который ранее был присваивающей таНос возвращения к содержимому указателя массив2 вместо массив2 (который в этот этап был также нераспределенные) указатель
  • регулировать распределение использовать sizeof(*array1+2) как идентифицировано @alk

скорректированный код

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

int main(int argc, char *argv[]) 
{ 
    int i, n, q = 0, k, *array2; 

    printf("Geben Sie eine natuerliche Zahl n ein: "); 
    scanf("%d", &n); 
    int *array = malloc((n-1)*sizeof(*array)); 
    printf("\n"); 

    for(i=0; i<=n-2; i++){ 
     array[i] = i+2; 
    } 

    while(q<=n-2){ 
     while(array[q]==0&&q<=n-2){ 
      q++; 
     } 
     for(i=q+1; i<=n-2; i++){ 
      if(array[i]%array[q]==0){ 
       array[i] = 0; 
      } 
     } 
     q++; 
    } 

    PART1: 
    for(i=0; array[i]!=0; i++){ 
     if(array[i+1]==0){ 
      int j; 
      for(j=i+1; j<=n-2; j++){ 
       if(array[j]!=0){ 
        array[i+1] = array[j]; 
        array[j] = 0; 
        goto PART1; 
       } 
      } 
      k = i; 
      goto PART2; 
     } 
    } 

    PART2: 
    array2 = malloc((k+1)*sizeof(*array2)); 

    for(i=0; i<=k; i++){ 
     array2[i]=array[i]; //Here's where the program crashes 
    } 

    free(array); 

    for(i=0; i<k; i++){ 
     printf("%d ,", array2[i]); 
    } 

    printf("%d\n\n", array2[k]); 

    free(array2); 
    return 0; 
} 

Смотрите также статью о реализации sieve of erastothenes в с.

Смежные вопросы