0

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 でシステム コールを行うために、このコードを編集します。

ac プログラムがユーザーからの入力を受け取り、さらに計算するためにそれをカーネルに渡す場合、配列の受け渡しは機能しますか?

(例 - ここでは、入力を取得するための main() 関数とカーネルへの fxn() 関数

4

2 に答える 2

1

セグメンテーション違反/エラーは、プログラムがメモリにアクセスしている(読み取りまたは書き込み)ことを示します。これは、プログラムに属していません(つまり、プログラムにアクセスするための「権利」がありません)。これには、アレイメンバーへのアクセスが含まれます。

これで、コードに1つの可能性と1つの明確な問題が見られます。

  1. いくつかのプロセスnを読み込み、配列atと値を入力btnます。これは、配列の長さが10のみであると宣言したため、最大で10個のプロセスがある場合にのみ正しくなります。

  2. 関数fxnでは(ところで、この関数にこれ以上名前を付けることはできませんか?)wt、長さの配列nを作成しています(また、tt使用しない配列も作成します)。技術的に正しいwtのは、いわゆるVLAまたは可変長配列です。これは特にC99にのみ存在します。これは、ほとんどのコンパイラがまだ完全にはサポートしていないC標準であるため、これらを避けたい場合があります(たとえば、mallocおよびfree)。それで、実際の問題は何ですか?

これ:

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

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

}

iからの値を持つ0ことができるn-1ので、配列の範囲外のi+1値を持つことができ、セグメンテーション違反が発生します。nwt

配列についても考えるかもしれませんwt; あなたもそれを必要としません!ちょっとしたヒント。

于 2012-04-13T20:09:16.543 に答える
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=0fxn

于 2012-04-13T20:07:53.603 に答える