添加指向数组的指针时出现分段错误
Posted
技术标签:
【中文标题】添加指向数组的指针时出现分段错误【英文标题】:Segmentation fault when adding a pointer to an array 【发布时间】:2013-04-06 18:43:38 【问题描述】:我创建了两个班级,班级和学生。在 Class 构造函数中,我需要动态初始化一个指向 Student 对象的指针数组(pStudents)(我不能使用向量),初始化为 null。当我使用函数 addStudent 将学生添加到班级时,我希望能够在指针数组中搜索第一个空地址,然后将学生分配到数组中的那个位置。如果学生已经在课堂上,我还希望能够搜索数组以查看该学生是否已经在课堂上。
当我尝试编译程序时,我遇到了分段错误。我知道这与我在创建 pStudents 数组时使用堆内存的方式有关,但我不确定如何解决这个问题。
这是我在 Class 头文件中声明数组的方式:
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;
【问题讨论】:
什么是ptrFlights[i]
?
编译或运行时是否出现段错误?你的意思是编译时出错了?
抱歉,已将我的错字修正为 ptrStudents。我应该更清楚,这是我运行程序的时候。它会编译但不能正确运行(我正在使用的编辑器结合了这两个步骤)。
【参考方案1】:
您需要将数组中的每个指针初始化为 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 数组;在构造函数中创建一个本地数组,而不是初始化成员数组。
【讨论】:
我已经尝试过这样做,但不幸的是仍然出现错误。 @JesseP_613 那是因为你的其他错误。阅读其他答案。 抱歉,我的第一个答案误导了您。我忽略了您在构造函数中重新声明数组的事实。 谢谢。我已经修复了我的代码以在构造函数中初始化数组的值(ptrStudents = new Student*[40],然后是循环)。但是要明确一点,我应该如何在头文件中声明数组? 和之前一样:Student **ptrStudents;
【参考方案2】:
类头中声明的数组永远不会初始化。
Student **ptrStudents = new Student*[40];
这声明了一个局部变量并用新数组初始化它。
改成:
ptrStudents = new Student*[40];
【讨论】:
【参考方案3】:至少两个错误
首先,您应该将数组值初始化为 NULL(正如 Parker Kemp 所说)
其次,您在构造函数中声明了一个名为 ptrStudents 的局部变量,该变量隐藏也称为 ptrStudents 的类变量。您应该删除该声明。就这样
Class::Class()
ptrStudents = new Student*[40];
for(int i = 0; i < 40; i++)
ptrStudents[i] = 0;
【讨论】:
【参考方案4】:根据你展示的内容猜测
Class::Class()
Student **ptrStudents = new Student*[40];
声明一个新的Student **ptrStudents
。要初始化成员ptrStudents
,您不必声明它。它已经被声明了。
你想要的是
Class::Class()
ptrStudents = new Student*[40];
【讨论】:
以上是关于添加指向数组的指针时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章