C程序中的SIGXCPU错误

use*_*211 1 c recursion infinite-loop

以下程序不生成输出.它进入for循环并获取一个值(via scanf)但在此之后代码块停止执行.Ideone(在线编译器和调试工具)表示生成了SIGXCPU信号.

#include <stdio.h>
#include <stdlib.h>

long fact(int);
int z(int);

int main()
{
    int i, n; 
    scanf("%d",&n); 
    int a[10];long b[10];
    int c[10];
    for(i=0;i<n;i++)
    {
        scanf("%d", &a[i]);
        b[i]=fact(a[i]);
        c[i]=z(b[i]);
    }
    printf("\n");
    for(i=0; i<n; i++)
    {
        printf("%d", c[i]);
    }
    return 0;
}

long fact(int m)
{
    if (m==1) return 1;
    else return (m*fact(m-1));
}

int z (int s)
{
    int c=0, temp;
    temp=s%10;
    if(temp!=0) return c;
    else
    {
        c++; z(temp);
    }
}
Run Code Online (Sandbox Code Playgroud)

SIGXCPU信号是什么意思?

小智 7

SIGXCPU它超过其上消耗的处理器时间限制之后信号被发送的每个第二至过程(RLIMIT_CPU),或者,对于实时进程,其上没有睡眠运行极限.这里的问题是您的递归z函数不会停止并一次又一次地调用自身(并导致堆栈溢出).修复其停止状态.

信号手册页:

Signal | Default Action | Description
-------+----------------+-------------------------
SIGXCPU| A              | CPU time limit exceeded.
Run Code Online (Sandbox Code Playgroud)

默认操作如下:

A - 过程异常终止.另外,可能发生实现定义的异常终止动作,例如创建核心文件.


Ran*_*ard 6

它可能消耗比 ideone 允许的更多的 CPU 时间和/或相关资源,因此您的程序不会使站点过载。

检查您的递归和终止条件。