我在下面编写了代码作为学校作业的一部分。它根据学生ID对一组对象指针进行排序,这是一个介于100和999之间的私有int。但由于某种原因,我在VS12中调试时在getId函数上遇到以下错误:
Unhandled exception at 0x001066F6 in task2.exe:
0xC0000005: Access violation reading location 0x0000000C.
这是使用getId的代码:
if (nr_of_students > 1) {
int pre = nr_of_students - 1;
int current = nr_of_students;
Student* temp;
// This pause will run:
system("pause");
while (pre > 0 && students[pre]->getId() > students[current]->getId()) {
// This pause will NOT run:
system("pause");
temp = students[current];
students[current] = students[pre];
students[pre] = temp;
pre--;
current--;
}
}
学生班的代码:
class Student : public Person {
private:
int id;
/* Other variables */
public:
/* Constructors and functions */
int getId() {
return id;
}
};
到底是怎么回事?
答案 0 :(得分:1)
最可能的原因基于提供的信息:
current
等于nr_of_students
,等于
while (pre > 0 && students[pre]->getId() > students[current]->getId())
current
用作数组索引。由于数组索引从zero
开始,如果nr_of_students
实际上等于数组中元素数,这将是一个问题。对于前者如果有5
个元素,则最大索引可以是4
,而不是5
。如果您使用5
,则内存位置无效,将返回无效Student*
,并且使用此无效指针调用getId()
将导致访问冲突错误。< / p>