C++ C++;:访问结构数组';s元素使程序崩溃

C++ C++;:访问结构数组';s元素使程序崩溃,c++,fstream,C++,Fstream,我正在尝试学习结构,我有一个程序崩溃了,我不明白为什么。编译器在尝试访问结构数组的元素时抛出错误的访问异常 代码如下: #include <iostream> #include <fstream> FILE *input; int n=1; struct Student { string name; string city; int grades[4]; }; Student *students = new Student[n]; int m

我正在尝试学习结构,我有一个程序崩溃了,我不明白为什么。编译器在尝试访问结构数组的元素时抛出错误的访问异常

代码如下:

#include <iostream>
#include <fstream>

FILE *input;

int n=1;
struct Student {
    string name;
    string city;
    int grades[4];
};
Student *students = new Student[n];

int main(int argc, const char * argv[]) {

input = fopen("input.txt", "r");
if(input==NULL) {
    cout<<"\nCan't open file input.txt";
    return;
}

int size;
if(fscanf(input, "Size%d\n\n",&size)<=0) {
    cout<<"\nAn error occurred.";
    return;
}
n=size;
cout<<"\nThe size is "<<n;
for(int i=0;i<n-1;i++) {
    Student newStud;
    char name[255];
    char city[255];
    fscanf(input, "\n%s\n%s\n%d;%d;%d;%d;",name,city,&newStud.grades[0],&newStud.grades[1],&newStud.grades[2],&newStud.grades[3]);
    newStud.fullName = name;
    newStud.city = city;
    cout<<"\nAdding student at "<<i;
    students[i]=newStud;
    cout<<"\nAdded successfully";
}
fclose(input);

cout<<"\nLoad complete!";
}
控制台输出:

The size is 5
Adding student at 0
Added successfully
Adding student at 1

students
指针的初始化在执行
main
之前完成。那时你就不会读
n
。因此,您的代码最终为
students
数组中的1个学生分配内存

main
中的代码假定
students
数组能够容纳
size
(或
n
的当前值),而实际上并非如此。因此,代码最终访问未知位置,从而导致未定义的行为(几乎总是分段错误)


修复方法是在获取
n
的输入后为数组分配内存。

显然,当您试图访问数组中的第二个学生时,程序崩溃,而您只为其分配了一个大小的学生。您应该在代码“n=size”之后分配阵列内存,而不是在代码“n=size”之前,您在主入口顶部所做的分配对于您的目的来说是绝对不合理的。

使用所有警告和调试信息进行编译(例如,
g++-Wall-Wextra-g
with…)。改进代码以不获取警告。使用调试器(例如,
gdb
)了解程序内部发生的情况。迫切建议阅读:由于
n
1
,在分配数组时-数组仅包含一个
学生
,当您尝试访问数组的第二个元素时,由于取消对未分配内存的引用,您正在调用未定义的行为。
The size is 5
Adding student at 0
Added successfully
Adding student at 1