2014-11-16 5 views
0

Я борюсь со следующим кодом, написанным на языке С. Это приводит к ошибке сегментации при выполнении. ошибка приходит при исполнении линииОтсутствует ошибка при отладке кода C, но при выполнении команды возникает ошибка СЕГМЕНТАЦИИ. Зачем?

scanf("%d %d %d %d",&(plist[i]->arrival),&(plist[i]->burst),&(plist[i]->deadline),&(plist[i]->period)); 

Ниже весь код, который не дает никакой ошибки компиляции, но, бегите ошибку времени. Было бы здорово, если бы кто-нибудь здесь мог сказать мне, где я ошибаюсь.

#include <stdio.h> 
#include <stdlib.h> 
#define INT_MAX 9999999 
struct task 
{ 
int arrival,burst,period,deadline,remaining,flag; 
}; 
void main() 
{ 
int i,n,time,flags=0,smallest; 
struct task *list,**plist; 
printf("\nEnter number of tasks :: "); 
scanf("%d",&n); 
list= (struct task *)malloc(sizeof(struct task)*n+1); 

plist=(struct task **)malloc(sizeof(struct task*)*n+1); 

for (i=0;i<=n;++i) 
{ 
    plist[i]=&list[i]; 
} 
plist[n]->deadline=plist[n]->remaining=plist[n]->arrival=INT_MAX; 
for (i=0;i<n;++i) 
{ 
    printf("\nEnter Arrival time, Burst time, Deadline & Period of task T%d ::",i); 
    scanf("%d %d %d %d",&(plist[i]->arrival),&(plist[i]->burst),&(plist[i]->deadline),&(plist[i]->period)); 
    plist[i]->flag=0; 
    plist[i]->remaining=plist[i]->burst; 
} 
for(time=0;;time++) 
{ 

    smallest=n; 
    for(i=0;i<n+1;++i) 
    { 
     if(plist[i]->arrival<=time && 
     plist[i]->deadline<plist[smallest]->deadline && 
     plist[i]->remaining>0) 
     { 
      smallest=i; 
     } 
    } 
    plist[smallest]->remaining--; 
    if(plist[smallest]->remaining==0) 
    { 
     if((plist[smallest]->flag==0)) 
     { 
      plist[smallest]->arrival=0; 
     } 

     plist[smallest]->flag=1; 

     plist[smallest]->arrival+=plist[smallest]->period; 



     plist[smallest]->remaining=plist[smallest]->burst; 
        printf("\nTask T%d completed at time %d.",smallest,time+1); 
        int j; 
        flags=0; 
        for(j=0;j<n;++j) 
        { 
         flags+=plist[j]->flag; 
        } 
    }if(flags==n)break; 
} 
free(plist); 
free(list); 
system("pause");  


} 

ответ

1

Вот проблема, в вашем коде вы выделили один дополнительный байт для структуры и массивы указателей

list= (struct task *)malloc(sizeof(struct task)*n+1); 
plist=(struct task **)malloc(sizeof(struct task*)*n+1); 

Но ваш индекс [n] показывает, что вам нужно выделить один дополнительный элемент массива каждый, поэтому вам нужны скобки вокруг (n+1)

list= (struct task *)malloc(sizeof(struct task)*(n+1)); 
plist=(struct task **)malloc(sizeof(struct task*)*(n+1)); 
+0

Это была глупая ошибка, но ее трудно распознать. Огромное спасибо. –

Смежные вопросы