结构崩溃

Structures crashing

本文关键字:崩溃 结构      更新时间:2023-10-16

我有一个关于结构的问题,因为我正在编写一些代码,并且在我添加结构后程序总是崩溃,所以我隔离了其中的一小部分,我发现结构STUDENT是它的原因。

当我在主程序中声明学生 [MAX] 数组时,程序崩溃了,我不知道为什么,该程序仅在我运行时运行

1.将学生中的科目2更改为非数组。但是,我确实需要存储多个属于学生的主题

2.在主不数组中声明学生。我需要一个数组,因为我必须存储可能大量的学生。

我的声明可能有问题吗?我恳请一些帮助,提前谢谢你。

#include<iostream>

using namespace std;
const int MAX = 100;
enum Grade {HDist, Dist, Credit, Pass, Fail};
struct assessment_Task
{
char Title_Name[MAX];
int Weight;
int Mark;
double A_Mark;
};

struct SUBJECT
{
  char subject_Code[MAX];
  char subject_Title[MAX];
  int No_Assess_Task;
  assessment_Task AT [MAX];
  int finalMark;
  Grade grade;
};
struct STUDENT
{
  char Name[MAX];
  int ID;
  char Subjects_Taken[2][50];
  SUBJECT subjects2 [MAX];
};
int main()
{
STUDENT students[MAX];


}

正如 John3136 所回答的那样,您可能会炸毁导致崩溃的堆栈。

我相信你不能很好地利用每个数组中的那么多元素,而且由于你使用的是C++,我建议使用 STL 容器来帮助你更好地管理内存。

首先,将所有char[]数组替换为 std::string 。除了内存管理之外,它还具有许多方便的功能。即使你真的需要一个 C 风格的字符串,你也可以调用 str.c_str() 来拥有一个。

然后,将所有这些数组替换为 std::vector 。这是C++中众所周知的动态数组容器。它使用动态内存分配来排列数组,并且不会像当前代码那样炸毁堆栈。

根据 32 位整数进行一些粗略计算,没有填充等 - 基本上是一些简单的假设

  • assessment_Task约为 112 字节
  • 主题约为 11412 字节
  • 学生大约 1141404 字节(超过 1 meg(
  • 因此,您的 100 名学生超过 100 meg

所以这是你试图放在堆栈上的 100 Meg 以上。根据操作系统的不同,您的堆栈大小可能高达 8 meg 左右(无需特殊的编译器选项来设置它(。要确认,请尝试将学生数组设置为较小的大小(例如 1(

基本上,您需要减小MAX或对不同的零件使用不同的MAX来减小尺寸。显然,最好的解决方案是使用向量或类似物并动态分配结构。

有关堆栈大小的详细信息,请参阅 Linux 中进程的堆栈大小是否有限制和程序的最大堆栈大小 C/C++。