FCFS调度代码中的分段错误

时间:2012-04-13 19:52:13

标签: c linux segmentation-fault system-calls

我正在为FCFS调度编写此代码。但在Linux中这是给予的 “分段错误”。如何纠正这样的错误?

 #include<stdio.h>
#include<string.h>
float fxn();

int main()
{

float avgwt;
int n,i,at[10],bt[10];
printf("\n\nEnter the number of processes:");
scanf("%d",&n);
printf("\n\n BURST TIME and ARRIVAL TIME of thr process");
for(i=0;i<n;i++)
{
printf("\n ARRIVAL TIME :");
scanf("%d",&at[i]);
printf(" BURST TIME : ");
scanf("%d",&bt[i]);
}

avgwt=fxn(at,bt,n);

printf("\n\nAverage waiting time=%f",avgwt);
return 0;

}



float fxn( int at[], int bt[], int n)

{

int i,j,t,wt[n],sum,tt[n],q;

float avgwt;


 for(j=i+1;j<n;j++)
  {
   if(at[i]>at[j])

    {
t=at[i];
at[i]=at[j];
at[j]=t;
q=bt[i];
bt[i]=bt[j];
bt[j]=q;
    }
   }


wt[0]=0;


for(i=0;i<n;i++)
{

wt[i+1]=wt[i]+bt[i];
sum=sum+(wt[i+1]-at[i]);

}

avgwt=sum/n;

return avgwt;


}

另一个问题----我将编辑此代码以在linux中进行系统调用。

如果c程序从用户那里获取输入并将其传递给内核进行进一步计算,那么数组的传递是否会起作用?

(例如 - 这里的main()函数用于将输入和fxn()函数带入内核

2 个答案:

答案 0 :(得分:1)

下面有缓冲区溢出
for(i=0;i<n;i++)
{

  wt[i+1]=wt[i]+bt[i];
   sum=sum+(wt[i+1]-at[i]);
  } 

它应该是i < n -1您还需要在函数i=0中初始化fxn

答案 1 :(得分:1)

分段错误/错误是程序访问内存(读取或写入)的指示符,它不属于您的程序(意味着它没有访问它的“权限”)。这包括访问数组成员。

现在我在您的代码中看到了一个可能的问题:

  1. 您已阅读了多个流程n,并使用at值填充了数组btn。只要最多有10个进程,这是正确的,因为您声明您的数组只有10个长度。

  2. 在你的函数fxn中(顺便说一下:你确定你不能更好地命名这个函数吗?)你正在创建一个长度为wt的数组n(也是你创建一个你甚至不使用的数组tt。技术上正确wt是一个所谓的VLA或可变长度数组,特别是只存在于C99中,这是大多数编译器仍然不完全支持的C标准,所以你可能想要避免这些(例如使用mallocfree)。那么实际问题是什么?

  3. 此:

    for(i=0;i<n;i++)
    {
    
    wt[i+1]=wt[i]+bt[i];
    sum=sum+(wt[i+1]-at[i]);
    
    }
    

    i可以包含从0n-1的值,因此i+1的值n可能超出数组wt的范围1}},导致段错误。

    您也可以考虑一下您的数组wt;你甚至都不需要它!只是一个提示。