【问题标题】:No errors while debugging C code, but it gives SEGMENTATION fault while executing. Why?调试 C 代码时没有错误,但在执行时会出现 SEGMENTATION 错误。为什么?
【发布时间】:2014-11-17 04:26:02
【问题描述】:

我正在为以下用 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");    


}

【问题讨论】:

    标签: debugging


    【解决方案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));
    

    【讨论】:

    • 这是一个愚蠢的错误,但很难识别。非常感谢。
    猜你喜欢
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2023-01-25
    • 2018-01-27
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    相关资源
    最近更新 更多