结构成员在访问时被清除

struct members gets cleared when accessed

本文关键字:清除 访问 成员 结构      更新时间:2023-10-16

首先,如果我的解释不好,我想道歉,英语不是我的第一语言。如果您不理解我在这里写的内容,我很乐意尝试更好地解释。

我正在尝试解决这个问题。我有一个结构数组(工作坊(,它是另一个结构(Available_Workshops(的成员。我的问题是数组中 Workshop 结构的所有实例的所有数据成员在CalculateMaxWorkshops函数中的 for 循环第一次迭代后被清除,从而导致第一次循环后出现分段错误。我尝试使用向量和动态数组,但问题仍然存在。

这是我的代码。

#include <iostream>
using namespace std;
struct Workshop
{
int start = 0;
int dur = 0;
int end = 0;
};
struct Available_Workshops
{
int n = 0;
Workshop *arr = new Workshop[n];
};
Available_Workshops* initialize(int s[], int d[], int n)
{
Available_Workshops aw;
Available_Workshops *u;
aw.n = n;
for (int i = 0 ; i < n ; i++)
{
Workshop w;
w.start = s[i];
w.dur = d[i];
w.end = w.start + w.end;
cout << w.end;
aw.arr[i] = w;
}
u = &aw;
return u;
};
int CalculateMaxWorkshops(Available_Workshops *time_table)
{
int n = time_table-> n, //number of workshop objects
int current_class, next_class=0;
int max_classes = 0;
for (int i = 0 ; i < n-1 ; i++)
{
Workshop cur = time_table -> arr[i];
current_class = cur.end; //all struct members gets cleared for some reason after this line
}
}

我只能编辑上面的内容,下面的代码被锁定在站点编辑器中。

int main() {
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;
}

我在CalculateMaxWorkshops函数中尝试了不同的方法,它导致了不同的问题。

int CalculateMaxWorkshops(Available_Workshops *time_table)
{
int n = time_table -> n, //number of workshop objects
int current_class, next_class=0;
int max_classes = 0;
for (int i = 0 ; i < n-1 ; i++)
{
Workshop *cur = &(time_table -> arr[i]);
current_class = cur -> end;
}
}

这次的问题是数组向后"偏移"。换句话说,存储在 arr[i] 中的数据将存储在 arr[i-1] 中,而存储在 arr[n-i-1] 中的数据将重新初始化。

总之,第一个问题是数据正在变为 NULL,而第二个问题是数据正在向后偏移并重新初始化,例如start = -17891602

在此函数中,您将返回一个存储局部变量地址的指针:

Available_Workshops* initialize(int s[], int d[], int n)
{
Available_Workshops aw;
Available_Workshops *u;
// ...
u = &aw;
return u;
};

取消引用此函数返回的指针将调用未定义的行为。

您需要为此指针分配内存:

Available_Workshops* initialize(int s[], int d[], int n)
{
Available_Workshops aw;
Available_Workshops *u;
// ...
u = new Available_Workshops{aw};
return u;
};

然后记得以后delete这段记忆。

一般来说,我建议使用std::unique_ptr,或者最好完全避免指针。但是,由于您无法更改main,这不是您的选择。

除了 cigien 指出的问题,你在这里还有另一个问题

struct Available_Workshops
{
int n = 0;
Workshop *arr = new Workshop[n];
};

arr是指向零长度数组的指针(因为n为零(。但在这里

for (int i = 0 ; i < n ; i++)
{
...
aw.arr[i] = w;
}

你把它当作一个长度n

.您需要为足够的研讨会分配内存。执行此操作的简单方法是在构造函数中

struct Available_Workshops
{
Available_Workshops(int num) : n(num), arr(new Workshop[num]) {}
int n;
Workshop *arr;
};

然后你可以像这样使用

Available_Workshops* initialize(int s[], int d[], int n)
{
Available_Workshops *u = new Available_Workshops(n);
for (int i = 0 ; i < n ; i++)
{
Workshop w;
w.start = s[i];
w.dur = d[i];
w.end = w.start + w.end;
cout << w.end;
u->arr[i] = w;
}
return u;
};