Ошибка сегментации с алгоритмом решет Эратосфена в C

Итак, эта функция, которую я создал, использует алгоритм решета Эратосфена для вычисления всех простых чисел ‹= n. Эта функция сохраняет простые числа и количество простых чисел в параметрах.

Когда функция завершается, простые числа должны указывать на участок динамически выделенной памяти, в котором хранятся все простые числа ‹= num. *count будет иметь количество простых чисел.

Вот моя функция getPrimes:

void getPrimes(int usernum, int* count, int** array){
    (*count) = (usernum - 1);
    int sieve[usernum-1], primenums = 0, index, fillnum, multiple;

    //Fills the array with the numbers up to the user's ending number, usernum.
    for(index = 0, fillnum = 2; fillnum <= usernum; index++, fillnum++){
        sieve[index] = fillnum;
    }

     /*Starts crossing out non prime numbers starting with 2 because 1 is not a prime. It then deletes all of those multiples and 
     moves on to the next number that isnt crossed out, which is a prime. */
     for (; primenums < sqrt(usernum); primenums++){ //Walks through the array.
         if (sieve[primenums] != 0){ //Check's if that number is 0 which means it's crossed out
             for (multiple = (sieve[primenums]); multiple < usernum; multiple += sieve[primenums]){ //If it is not crossed out it starts deleting its multiples.
                 //Crossing multiples out and decrements count to move to next number
                 sieve[multiple + primenums] = 0;
                 --(*count);
             }
         }
     }
     int k;
     for (k = 0; k < usernum; k++)
     if (sieve[k] != 0){
         printf(" %d", sieve[k]);
     }
     printf(" ");
     array = malloc(sizeof(int) * (usernum + 1));
     assert(array);
     (*array) = sieve;
 }

Моя функция здесь отлично компилируется, однако я заметил, что у меня есть ошибка сегментации, когда я пробую большие числа, например, 101. Кто-нибудь видит, где мой код вызывает ошибку сегментации?


person Hetero Myde    schedule 30.03.2013    source источник
comment
Если вы запустите свой код в отладчике, он сообщит вам, где находится seg-fault. Более того, вы сможете проверять значения переменных и т. д.   -  person Oliver Charlesworth    schedule 30.03.2013
comment
Был бы очень признателен, если бы кто-то мог мне помочь здесь.   -  person Hetero Myde    schedule 30.03.2013
comment
Вы находитесь в идеальном положении, чтобы сделать это самостоятельно. Как я уже сказал, запустите это в отладчике.   -  person Oliver Charlesworth    schedule 30.03.2013
comment
Не могли бы вы предложить мне определенный отладчик   -  person Hetero Myde    schedule 30.03.2013
comment
Ну, я не знаю, на какой ты платформе. Если вы используете IDE (например, Visual Studio или Eclipse), то должен быть встроенный отладчик, который вы можете использовать. Если вы работаете в командной строке Linux, используйте GDB.   -  person Oliver Charlesworth    schedule 30.03.2013
comment
ТОЧНЫЙ ЖЕ вопрос, заданный одним и тем же пользователем здесь: .com/questions/15712513/   -  person joce    schedule 30.03.2013
comment
ТОЧНО ЖЕ?! Ты издеваешься. Это связано с ошибкой сегментации с моим текущим кодом. Это не дубликат.   -  person Hetero Myde    schedule 30.03.2013
comment
Кроме того, Оли... Я безуспешно пытался использовать GDB. Не уверен, почему это не сработало. Поэтому я определенно был бы признателен за помощь от людей на SO.   -  person Hetero Myde    schedule 30.03.2013
comment
Не сработало? В чем была проблема?   -  person Oliver Charlesworth    schedule 30.03.2013
comment
Хорошо, если честно, похоже, вы бы предпочли, чтобы кто-то другой решил вашу проблему за вас, вместо того, чтобы тратить время на изучение того, как выполнять отладку самостоятельно. Это не очень хороший подход. Если нет, то докажите, что я ошибаюсь, отредактировав свой вопрос, чтобы описать, что вы нашли с помощью GDB...   -  person Oliver Charlesworth    schedule 30.03.2013
comment
Ты прав. Я работаю над этим долгое время и просто хочу, чтобы это закончилось ... действительно не очень хороший подход, лол.   -  person Hetero Myde    schedule 30.03.2013
comment
Сейчас отлаживаю, пока ничего не обнаружил   -  person Hetero Myde    schedule 30.03.2013


Ответы (1)


Следующие два утверждения являются проблемами:

array = malloc(sizeof(int) * (usernum + 1));

Я думаю, вы хотели сделать *array = malloc..., обратите внимание на звездочку, которую я добавил перед array. Вы хотите разыменовать параметр int**, чтобы изменить указатель вызывающего объекта.

(*array) = sieve;

Этот код не копирует массив, он присваивает адрес временной локальной переменной указателю вызывающего объекта. Массив sieve больше не будет существовать после того, как он выйдет за пределы области видимости в конце функции. Вы хотите использовать цикл for для копирования содержимого из sieve в только что выделенный блок памяти.

Редактировать:

Я вижу, что Даниэль Фишер уже указал на вторую проблему 3 часа назад в предыдущем воплощении вашего вопроса.

person Blastfurnace    schedule 30.03.2013