-1

这是一个简单的 c 并行程序。

我正在使用 ubuntu 和 gcc 进行编译。

该程序接受进程数量的输入,并创建并要求用户提供相同数量的数字。然后每个过程用于计算每个数字的阶乘。

#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>

int factorial(int n)
{
    int fact=1;
    int i;
    for(i=1 ; i<=n ; i++)
    {
        fact=fact*i;
    }
    return fact;
}

int main()
{
    int process_id;
    int num_process;
    int pid;
    int i;

    printf("\nEnter No. of Process : ");
    scanf("%d",&num_process);

    int num[num_process];

    for ( i=1; i < num_process; i++ )
    {
        printf("\nEnter %d Number : ",i);
        scanf("%d", &num[i]);
    }

    for ( i=0; i < num_process; i++ )
    {
        pid=fork();
        if (pid == -1)
        {
            perror("Error forking");
            return -1;
        }
        else if(pid > 0)
        {
            waitpid(-1, NULL, 0);
        }
        else
        {
            printf("\nFactorial of %d is : %d", num[i], factorial(num[i]));
            exit(0);
        }

    }
    return 0;
}

从来没有听说过分段错误,有人可以解释它是什么意思吗?

4

3 回答 3

2

这个:

for ( i=1; i <= num_process; i++ )
{
    printf("\nEnter %d Number : ",i);
    scanf("%d", num[num_process]);
}

是有问题的。有效索引为num0 到 num_process - 1。将循环更改为:

for ( i=0; i < num_process; i++ )
于 2013-02-24T15:25:56.883 回答
2

在您的factorial函数中,fact未初始化。还

 scanf("%d", num[num_process]);

应该

 scanf("%d", &num[num_process]);
于 2013-02-24T15:26:34.090 回答
1

可以在此处阅读分段错误的描述。

这里有一个错误:

   scanf("%d", num[num_process]);

因为您从 1 开始计数 - 数组从零开始

这条线for ( i=0; i <= num_process; i++ )会给你太多的过程。

fork创建另一个进程 - 因此程序不是并行的 - 您需要使用线程。请谷歌它。

于 2013-02-24T15:26:35.977 回答