向数组添加指针时出现分段错误

问题描述:

我创建了两个类,Class和Students。在类的构造函数中,我需要动态地初始化指向Student对象的指针数组(pStudents)(我不能使用矢量),初始化为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; 
} 
+1

什么是'ptrFlights [I]'? – YankeeWhiskey 2013-04-06 18:46:33

+0

当你编译或者运行时,你会遇到段错误吗?你的意思是编译时出错了吗? – 2013-04-06 18:48:10

+0

对不起,修正了我的错字给ptrStudents。我应该更清楚,这是我运行程序的时候。它会编译但不能正确运行(我正在运行的编辑器将两个步骤结合在一起)。 – 2013-04-06 18:51:34

需要初始化每个指针数组为NULL英寸将您的构造函数更改为:

Class::Class() 
{ 
ptrStudents = new Student*[40]; 
for(int i = 0; i < 40; i++) 
    ptrStudents[i] = 0; //NULL 
} 

当您创建指针时,它不会自动初始化为NULL。所以,发生了什么事是你必须的垃圾数据一堆随机指针,当你到达线

if (ptrStudents[i] != 0) 

他们都通过,因为他们没有空,即使它们是不可用的。

哎呀,我错过了一个大的,即使当我复制你的代码(谢谢你,约翰)。你不应该重新声明ptrStudents数组;在构造函数中创建一个本地数组,而不是初始化成员数组。

+0

我已经尝试做到这一点,不幸的是仍然得到一个错误。 – 2013-04-06 18:52:10

+0

@ JesseP_613这是因为你的其他错误。阅读其他答案。 – john 2013-04-06 18:52:37

+0

我的歉意,我的第一个答案引导你错了。我忽略了你在构造函数中重新声明数组的事实。 – 2013-04-06 18:55:16

在类头中声明的数组永远不会被初始化。

Student **ptrStudents = new Student*[40];

声明一个局部变量,并与新的数组初始化。

将其更改为:

ptrStudents = new Student*[40];

至少有两个错误

首先你应该initalise你的阵列值NULL(帕克肯普说)

其次,你已经声明的局部变量在你的构造函数中被称为ptrStudents,其中隐藏了这个类变量也被称为ptrStudents。你应该删除该声明。所以,像你证明什么

Class::Class() 
{ 
    Student **ptrStudents = new Student*[40]; 
} 

声明了一个新的Student **ptrStudents猜想这个

Class::Class() 
{ 
    ptrStudents = new Student*[40]; 
    for(int i = 0; i < 40; i++) 
     ptrStudents[i] = 0; 
} 

。要初始化成员ptrStudents,您不必声明它。它已经被宣布。

你想要的是

Class::Class() 
{ 
    ptrStudents = new Student*[40]; 
}