我创建了两个班级,班级和学生。在类构造函数中,我需要动态地将一个指针数组(pStudents)初始化为Student对象(我不能使用向量),初始化为null。当我使用addStudent函数向学生添加学生时,我希望能够在指针数组中搜索第一个空地址,然后将学生分配到数组中的那个位置。如果学生已经上课,我也希望能够搜索该数组以查看该学生是否已经在那里。
当我尝试编译程序时,我遇到了分段错误。我知道它与我在创建pStudents数组时使用堆内存的方式有关,但我不确定如何解决这个问题。
以下是我在类头文件中声明数组的方法:
Student **ptrStudents;
这是Class对象的构造函数。现在,我正在使用任意大小为40的数组。
Class::Class()
{
Student **ptrStudents = new Student*[40];
}
这是函数addStudents,它将指向学生对象的指针作为其参数。请注意,字符串名称是所有学生的数据字段。
Class::addStudents(Student *student)
{
string name = student -> getName();
string nameTemp;
for (int i = 0; i < 40; i++)
{
if (ptrStudents[i] != 0)
{
nameTemp = ptrStudents[i] -> getName();
if (name == nameTemp)
{
cout << "This student is already in the class." << endl;
return;
}
}
else if (ptrStudents[i] == 0)
{
ptrStudents[i] = student;
return;
}
这是我正在使用的主要功能:
int main ()
{
Class Economics;
Student student1("Hannah");
Economics.addStudent(&student1);
return 0;
}
答案 0 :(得分:0)
您需要将数组中的每个指针初始化为NULL。将构造函数更改为:
Class::Class()
{
ptrStudents = new Student*[40];
for(int i = 0; i < 40; i++)
ptrStudents[i] = 0; //NULL
}
创建指针时,它不会自动进行NULL初始化。所以正在发生的事情是你有一堆垃圾数据的随机指针,当你到达行
if (ptrStudents[i] != 0)
它们都通过,因为它们不是NULL,即使它们不可用。
哎呀,我错过了一个大错,即使我复制了你的代码(谢谢你,约翰)。你不应该重新声明ptrStudents数组;在构造函数中创建一个本地数组,而不是初始化成员数组。
答案 1 :(得分:0)
在类头中声明的数组永远不会被初始化。
Student **ptrStudents = new Student*[40];
这声明了一个局部变量并用新数组初始化它。
将其更改为:
ptrStudents = new Student*[40];
答案 2 :(得分:0)
至少有两个错误
首先,您应该将数组值初始化为NULL(如Parker Kemp所说)
其次,您在构造函数中声明了一个名为ptrStudents的局部变量,隐藏类变量,也称为ptrStudents。你应该删除该声明。所以喜欢这个
Class::Class()
{
ptrStudents = new Student*[40];
for(int i = 0; i < 40; i++)
ptrStudents[i] = 0;
}
答案 3 :(得分:0)
根据你的表现猜测
Class::Class()
{
Student **ptrStudents = new Student*[40];
}
声明一个新的Student **ptrStudents
。要初始化成员ptrStudents
,您不必声明它。它已经宣布。
你想要的是
Class::Class()
{
ptrStudents = new Student*[40];
}