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:

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

我应该说为什么会出现段错误:这是因为每个函数调用都会推送当前程序计数器(程序中您当前所在的位置)和堆栈上的函数参数(也称为调用堆栈),其中堆栈是使用的相对较小的内存块对于函数调用和局部变量。

因此,如果你用力推你的筹码,它就会倒下。游戏结束,又名段错误;)

于 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 回答