Po uruchomieniu następującego kodu skompilowanego za pomocą gcc
(włączona jest tylko opcja -std=c99
) i uruchomienia pliku wykonywalnego, otrzymuję błąd segmentacji (rdzewiejący klucz msg).Dlaczego ten kod rekurencyjny generuje błąd segfault?
Dlaczego tak jest?
#include <stdio.h>
int count_factors(int n, int i) {
int m = n;
if (m == i) {
return 1;
} else if (m % i == 0) {
while (m % i == 0) m = m/i;
return 1 + count_factors(m, i);
} else {
return count_factors(m, i+1);
}
}
int main() {
int streak_size = 4;
int streak = 0;
int solution = 0;
int n = 2;
while (solution == 0) {
n += 1;
int c = count_factors(n, 2);
if (c == streak_size) {
streak += 1;
} else {
streak = 0;
}
if (streak == streak_size) solution = n;
}
printf("%i", solution);
return 0;
}
Ponieważ nigdy nie wydostajesz się z rekursji w 'count_factors'. Wpisz 'printf ("% d% d \ n ", n, i);' na początku 'count_factors', a zrozumiesz. –
O ironio, na stronie o nazwie "StackOverflow". –
Powinieneś zawsze włączać ostrzeżenia podczas kompilacji, na przykład '-Wall'. Należy pamiętać, że jest to ogólna wskazówka i może nie pomóc w rozwiązaniu konkretnego problemu. –