c++11 - 什么是分段错误。如何处理
问题描述
问题:
- 一名学生报名参加了研讨会,并希望参加最多
数量的研讨会,其中没有两个研讨会重叠。您必须执行
以下操作: 实施结构:- struct Workshop 具有以下成员: 研讨会的开始时间。研讨会的持续时间。研讨会的结束时间。
- struct Available_Workshops 具有以下成员: 整数,(学生报名参加的研讨会数量)。具有大小的
Workshop 数组类型的数组。实现功能: - Available_Workshops* initialize (int start_time[], int duration[], int n) 创建一个 Available_Workshops 对象并使用 和 参数中的元素初始化其元素(两者都是 size )。这里, 和 分别是研讨会的开始时间和持续时间。此函数必须返回一个指向 Available_Workshops 对象的指针。
- 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;
}
我的代码没有运行。它有分段错误。请帮我找出这个错误
解决方案
您可以从类声明中看到您的错误:
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
被显式初始化为 0。然而,您的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]
推荐阅读
- react-native - React Native 中的 Stimulsoft report.js 报告
- java - Java动态方法创建
- ios - iOS 中的 Firebase 分析调试
- sql-server - 有什么方法可以从 SQL Server 2016 Profiler 连接到 SQL Server 2000
- php - 如何解码谷歌标签管理器 JSON
- glide-golang - golang build 命令返回意外的目录布局
- ruby-on-rails - 密码重置后设计自动登录不起作用
- sharepoint - Sharepoint 到 Alfresco 数据列表的迁移
- c - 如何修复确认错误canbus stm32
- python - IndexError:列表索引超出范围。这是在加密时