C++:访问结构数组的元素会使程序崩溃
C++: Accessing a structure array's element crashes the program
我正在尝试学习结构,但我有一个程序崩溃了 - 不明白为什么。尝试访问结构数组的元素时,编译器抛出错误访问异常。
代码如下:
#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
students
指针的初始化在main
执行之前完成。到那时你就不会读 n
了。因此,您的代码最终会在 students
数组中为 1 个 Student 分配内存。
您的 main
中的代码假定 students
数组能够保存 size
(或 n
的当前值),但实际上并非如此案子。因此,代码最终会访问导致未定义行为的未知位置(几乎总是分段错误)。
修复方法是在获取 n
的输入后为数组分配内存。
很明显,当你试图访问数组中的第二个学生时程序崩溃了,而你只为它分配了一个学生的大小。你应该在代码“n = size”之后而不是之前分配数组的内存,你在正门顶部所做的对于你的目的来说是绝对不合理的。
我正在尝试学习结构,但我有一个程序崩溃了 - 不明白为什么。尝试访问结构数组的元素时,编译器抛出错误访问异常。
代码如下:
#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
students
指针的初始化在main
执行之前完成。到那时你就不会读 n
了。因此,您的代码最终会在 students
数组中为 1 个 Student 分配内存。
您的 main
中的代码假定 students
数组能够保存 size
(或 n
的当前值),但实际上并非如此案子。因此,代码最终会访问导致未定义行为的未知位置(几乎总是分段错误)。
修复方法是在获取 n
的输入后为数组分配内存。
很明显,当你试图访问数组中的第二个学生时程序崩溃了,而你只为它分配了一个学生的大小。你应该在代码“n = size”之后而不是之前分配数组的内存,你在正门顶部所做的对于你的目的来说是绝对不合理的。