并行程序中的GCC分段故障

时间:2013-02-24 15:20:36

标签: c linux gcc parallel-processing

这是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;
}

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

3 个答案:

答案 0 :(得分:2)

此:

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

有问题。 num的有效索引为0到num_process - 1.将循环更改为:

for ( i=0; i < num_process; i++ )

答案 1 :(得分:2)

factorial功能中,fact未初始化。还

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

应该是

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

答案 2 :(得分:1)

可以读取分段错误的说明here

这里有一个错误:

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

因为你从1算起 - 数组从零开始

此行for ( i=0; i <= num_process; i++ )会为您提供太多流程。

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