【问题标题】:Segmentation error in FCFS Scheduling codeFCFS 调度代码中的分段错误
【发布时间】:2012-04-13 19:52:13
【问题描述】:

我正在为 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() 函数带入内核

【问题讨论】:

  • 这是作业吗?如果是这样,请添加 HOMEWORK 标签。您是否尝试过使用 gdb 进行调试?您是否尝试确定错误发生在哪里?

标签: c linux segmentation-fault system-calls


【解决方案1】:

你在下面遇到了缓冲区溢出

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

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

它应该是i &lt; n -1,你还需要在函数fxn中初始化i=0

【讨论】:

  • @user1263375 看看这个wt[i+1]=wt[i]+bt[i];sum=sum+(wt[i+1]-at[i]);我刚刚指出了段错误,但似乎有一个逻辑错误:初始化总和并且在现有逻辑中at[n-1]bt[n-1] 不计入wt
【解决方案2】:

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

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

  1. 您读入了多个进程n,并用n 值填充您的数组atbt。只要最多有 10 个进程,这才是正确的,因为您声明数组的长度只有 10。

  2. 在你的函数 fxn 中(顺便说一句:你确定不能更好地命名这个函数吗?)你正在创建一个长度为 n 的数组 wt(你也创建了一个数组 @987654328 @ 你甚至不使用)。从技术上讲,wt 是一个所谓的 VLA 或可变长度数组,特别是仅存在于 C99 中,这是大多数编译器仍不完全支持的 C 标准,因此您可能希望避免使用这些 (例如使用mallocfree)。那么真正的问题是什么?

这个:

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 的范围,从而导致了段错误。

您可能还会考虑您的数组wt;你甚至不需要它!只是一个提示。

【讨论】:

  • 我的第二个问题呢?有什么线索吗?
  • 不太清楚你真正想要做什么,但如果你只是系统调用(就像fopenmalloc 等等),那么是的,你当然可以将你的数组作为参数传递——只要你调用的函数会期望这些类型(并且作为旁注:我不知道任何需要整数数组的系统函数;大多数时候他们期望特殊的structs) .所以,是的,我真的不知道该说什么。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多