简体   繁体   English

C的分段错误与Printf()和Scanf()

[英]C Segmentation Fault With Printf() and Scanf()

I'm new to C, and I'm getting a segmentation fault that I can't understand. 我是C语言的新手,但遇到了我无法理解的分段错误。 I have the following program, which attempts to calculates the number of factors of a strictly positive number: 我有以下程序,该程序尝试计算严格为正数的因数:

#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;
}

The segmentation fault occurs immediately after entering an integer and ENTER after these lines in main(): 在main()中的这些行之后输入整数并按ENTER键后,立即发生分段错误:

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

What in these lines is causing the segmentation fault, and what can I do to avoid it? 这些行中的什么导致了分段错误,我该怎么做才能避免呢?

Your recursion doesn't stop if you try to divide out factor one. 如果您尝试分解因子一,则递归不会停止。

Just let factor never be 1: 只是让因子永远不会是1:

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

I should say WHY it segfaults: It's because every function call pushes the current program counter (the position in your program where you currently stand) and function arguments on the stack (aka call stack), where the stack is a relatively small memory block used for, well, function calling and local variables. 我应该说为什么会出现段错误:这是因为每个函数调用都会将当前程序计数器(程序中您当前站立的位置)和函数参数推入堆栈(也称为调用堆栈),其中堆栈是使用的相对较小的内存块函数调用和局部变量。

So if you are pushing your stack too hard, it will fall over. 因此,如果您用力推动堆栈,堆栈将掉落。 End of game, aka segfault ;) 游戏结束,也就是段错误;)

You probably have a problem with this recursion: 您可能对此递归有问题:

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

Change your numberOfFactors to something like: 将您的numberOfFactors更改为以下内容:

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

And then, change this portion: 然后,更改此部分:

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

To something simpler like: 像这样简单一些:

if (check(number)){
    factors = numberOfFactors(number);
    printf("%d^%d ", number, factors);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM