Ошибка сегментации с помощью программы «Сито Эратосфена»

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

Это мой код:

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

#define LIMIT 1000000 /*size of integers array*/

int main(void){
    char n[LIMIT];

    //Reads the size of integer array
    printf("Size of array:\n");
    if((fgets(n, LIMIT, stdin)) == NULL) {
        fprintf(stderr, "Could not read from stdin\n");
        exit(1);
    }

    unsigned long long int i,j;
    int *primes;
    int z = 1;

    primes = malloc(sizeof(n));

    for (i = 2; i < sizeof(n); i++){
    primes[i] = 1; //setting every number in list to 1
    }

    for (i = 2; i < sizeof(n); i++){
        if (primes[i]){
            for (j = i; (i*j) < sizeof(n); j++){
                primes[i * j] = 0; //remove multiples
            }
        } 
    }

    for (i = 2; i < sizeof(n); i++){
        if (primes[i]){
            printf("%dth prime = %llu\n",z++,i);
        }
    }

    free(primes);

    return 0;
}

person user3291818    schedule 08.03.2014    source источник
comment
Заметил, что вы не приняли ни одного ответа на свои 5 предыдущих сообщений. Подумайте о том, чтобы принять ответ, который хорошо соответствует вашим потребностям.   -  person chux - Reinstate Monica    schedule 08.03.2014


Ответы (2)


char n[LIMIT];

Со значением LIMIT, равным 1000000, это действительно большой массив (один миллион байт). Это вызовет переполнение стека. Вам нужно динамически выделить память для него:

char *n = malloc(LIMIT);
person Yu Hao    schedule 08.03.2014

Код использует n любопытным образом. Предложите просто просмотреть целое число n и использовать n для завершения циклов, а не sizeof(n).

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

int main(void){
    unsigned long n;

    //Reads the size of integer array
    buffer[30];
    printf("Size of array:\n");
    if((fgets(buffer, sizeof buffer, stdin)) == NULL) {
        fprintf(stderr, "Could not read from stdin\n");
        exit(1);
    }
    if (sscanf(buffer,"%lu", %n) != 1) {
        fprintf(stderr, "Unable to covert to a number\n");
        exit(1);
    }

    unsigned long i,j;
    int *primes;
    // int z = 1;

    primes = malloc(n * sizeof *primes);

    for (i = 2; i < n; i++){
      primes[i] = 1; //setting every number in list to 1
    }

    for (i = 2; i < n; i++){
        if (primes[i]) {
            for (j = i; (i*j) < n; j++){
                primes[i * j] = 0; //remove multiples
            }
        } 
    }

    for (i = 2; i < n; i++){
        if (primes[i]){
            printf("%dth prime = %llu\n",z++,i);
        }
    }

    free(primes);
    return 0;
}
person chux - Reinstate Monica    schedule 08.03.2014