0

私は C が初めてで、理解できないセグメンテーション違反が発生しています。厳密に正の数の因数の数を計算しようとする次のプログラムがあります。

#include <stdio.h>
#include <math.h>

int numberOfFactors (int number, int factor) {
    if (number % factor == 0) {
        number = number/factor;
        return numberOfFactors(number, factor) + 1;
    } else {
        return 0;
    }
}

int check (int x) {
    if (x>0) {
        return 1;
    } else {
        return 0;
    }
}

int main(void) {
    int number;
    printf("Please enter a positive integer n such that n >= 1: ");
    scanf("%d", &number);
    if (check(number)){
        int i;
        for (i=1; i<=number; i++) {
            int factors;
            factors = numberOfFactors(number, i);
            printf("%d^%d ", i, factors);
        }
    }
    return 0;
}

セグメンテーション違反は、main() で次の行の後に整数と ENTER を入力した直後に発生します。

printf("Please enter a positive integer n such that n >= 1: ");
scanf("%d", &number);

これらの行の何がセグメンテーション違反を引き起こしていますか? また、それを回避するにはどうすればよいですか?

4

2 に答える 2

6

ファクター1を分割しようとしても、再帰は停止しません。

ファクターを1にしないでください。

    for (i=2; i<=number; i++) {
        int factors;
        factors = numberOfFactors(number, i);
        printf("%d^%d ", i, factors);
    }

なぜそれがsegfaultsなのかを言う必要があります:それは、すべての関数呼び出しが現在のプログラムカウンター(現在立っているプログラム内の位置)とスタック(別名呼び出しスタック)上の関数引数をプッシュするためです。スタックは比較的小さなメモリブロックが使用されますええと、関数呼び出しとローカル変数のために。

したがって、スタックを強く押しすぎると、スタックが倒れます。ゲームの終了、別名segfault;)

于 2012-04-13T16:03:20.783 に答える
0

おそらく、この再帰に問題があるでしょう:

int numberOfFactors (int number, int factor) {
    if (number % factor == 0) {
        number = number/factor;
        return numberOfFactors(number, factor) + 1;
    } else {
        return 0;
    }
}

numberOfFactors を次のように変更します。

int numberOfFactors (int number)
{
    int i=1;
    int ret=0;
    for(;i<=number;i++) {
        if (number%i == 0) {
            ret++;
        }
    }
    return ret;
}

次に、この部分を変更します。

if (check(number)){
    int i;
    for (i=1; i<=number; i++) {
        int factors;
        factors = numberOfFactors(number, i);
        printf("%d^%d ", i, factors);
    }
}

次のような簡単なものに:

if (check(number)){
    factors = numberOfFactors(number);
    printf("%d^%d ", number, factors);
}
于 2012-04-13T16:00:57.397 に答える