什么是分段故障。如何处理[重复]

问题描述 投票:0回答:1

问题:一个学生报名参加讲习班,想参加最多的讲习班,但两个讲习班不能重叠。

    • 一个学生报名参加了研讨会,并希望参加最多的研讨会,其中没有两个研讨会重叠。你必须做以下工作。实现结构。
      1. 结构 工作坊的成员如下: 工作坊的开始时间 工作坊的开始时间。工作坊的结束时间。
      2. 结构Available_Workshops有以下成员。一个整数,(学生报名参加的工作坊数量)。一个类型为Workshop的数组,大小为 。 实现的函数。
      3. Available_Workshops* initialize (int start_time[], int duration[], int n) 创建一个Available_Workshops对象,并使用参数和参数中的元素(两者都是大小)初始化其元素。这里,和是车间的开始时间和持续时间。这个函数必须返回一个Available_Workshops对象的指针。
      4. int CalculateMaxWorkshops(Available_Workshops* ptr) 返回学生可以参加的最多工作坊数量--没有重叠。在上一个工作坊结束之前,不能参加下一个工作坊。注意: 一个未知大小的数组( )应该按照以下方式声明。DataType* arrayName = new DataType[n];

    你的初始化函数必须返回一个指向Available_Workshops对象的指针。你的CalculateMaxWorkshops函数必须返回学生可以参加的非重叠的工作坊的最大数量。输入示例

6 1 3 0 5 5 8 1 1 6 2 4 1 采样输出

4

解释 第一行表示 ,车间的数量。下一行为空格分隔的整数,其中整数为车间的开始时间。下一行包含空格分隔的整数,其中整数为研讨会的持续时间。学生可以参加讲习班,并且没有重叠,所以CalculateMaxWorkshops返回到main(然后打印到stdout)。

我的代码。

#include <iostream>

using namespace std;


class Workshop{
    public:
    int start_time{},duration{},end_time{};};

class Available_Workshops
{
    public:
     int n{};
    struct Workshop*arr=new struct Workshop[n];
    ~Available_Workshops()
    {
        delete [] arr;

    }
    void arr_sort();
    void arr_delete(int i);


};
////////////////////////////////////////////////////////////////////////////////////////////
Available_Workshops * initialize(int start_time[],int duration[],int n)
{
    Available_Workshops * x=new Available_Workshops{};
    x->n=n;
    for(int i=0;i<n;i++)
    {
     x->arr[i].start_time=start_time[i];
     x->arr[i].duration=duration[i];
     x->arr[i].end_time=start_time[i]+duration[i];
    }

    return x;

}
///////////////////////////////////////////////////////////////////////////////////////////
void Available_Workshops:: arr_delete(int i)
{

    n-=1;


    for(int j=i;j<n;j++)
    {
     arr[j]=arr[j+1];
    }


}
///////////////////////////////////////////////////////////////////////////////////////////
void Available_Workshops:: arr_sort()
{
for(int i=0;i<n;i++)
{
    for(int j=i+1;j<n;j++)
    {
        if(arr[i].start_time>arr[j].start_time)
            {
                struct Workshop temp=arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
            }
    }
}


}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int CalculateMaxWorkshops(Available_Workshops * x)
{
    x->arr_sort();
    for(int i=0;i<x->n-1;i++)
    {
       for(int j=i+1;j<x->n;j++)
       {
           if(x->arr[i].end_time>x->arr[j].start_time)
           {
               if(x->arr[i].duration>=x->arr[j].duration)
                x->arr_delete(i);
               else x->arr_delete(j);
               j--;
           }
       }
    }
    int y=x->n;
    delete x;
   return y;

}

int main(int argc, char *argv[]) {
    int n; // number of workshops
    cin >> n;
    // create arrays of unknown size n
    int* start_time = new int[n];
    int* duration = new int[n];

    for(int i=0; i < n; i++){
        cin >> start_time[i];
    }
    for(int i = 0; i < n; i++){
        cin >> duration[i];
    }

    Available_Workshops * ptr;
    ptr = initialize(start_time,duration, n);

    cout << CalculateMaxWorkshops(ptr) << endl;
    return 0;
}

我的代码没有运行。它有分段故障。请帮我找到这个错误

c c++11 object segmentation-fault c++14
1个回答
0
投票

从类的声明中可以看出你的bug。

class Available_Workshops
{
public:
    int n{};
    struct Workshop* arr = new struct Workshop[n];

    ~Available_Workshops()
    {
        delete[] arr;

    }
    void arr_sort();
    void arr_delete(int i);


};

成员 n 然而,您的 initialize 函数会很高兴地将更多元素填入 arr (一个零元素的数组)并导致各种未定义的行为。

你真的,真的需要为你的类使用一个合适的构造函数,而不是试图内联初始化成员。

Available_Workshops(int size) :
n(size)
{
    arr = new Workshop[n];
}

另一个问题,虽然与你的崩溃无关,但在你的 arr_delete 功能。

for (int j = i; j < n; j++)
{
    arr[j] = arr[j + 1];
}

j == n-1 在循环的最后一次迭代中,它将执行 arr[n-1] = arr[n]. 进入 arr[n] 是未定义的行为,因为数组中唯一有效的索引来自于 [0..n-1]

© www.soinside.com 2019 - 2024. All rights reserved.