C ++:访问结构数组元素会导致程序崩溃

时间:2017-12-10 15:04:34

标签: 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 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!";
}

input.txt中:

Size5

Bob
NY
10;10;10;10;
Rick
SF
6;6;6;6;
John
NY
2;3;2;5;
Jack
NY
5;5;5;4;

控制台输出:

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

2 个答案:

答案 0 :(得分:1)

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

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

修复是在获取n的输入后为阵列分配内存。

答案 1 :(得分:0)

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