首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将指针添加到数组时出现分段错误

将指针添加到数组时出现分段错误
EN

Stack Overflow用户
提问于 2013-04-07 02:43:38
回答 4查看 744关注 0票数 0

我创建了两个类,Class和Students。在类构造函数中,我需要动态初始化一个指向学生对象的指针数组(pStudents) (我不能使用向量),初始化为null。当我使用函数addStudent将一个学生添加到类中时,我希望能够在指针数组中搜索第一个空地址,然后将该学生分配给数组中的那个点。如果学生已经在班上,我也希望能够搜索数组,看看这个学生是否已经在那里。

当我试图编译程序时,我得到了一个分段错误。我知道这与创建pStudents数组时使用堆内存的方式有关,但我不确定如何解决这个问题。

下面是我在Class头文件中声明数组的方式:

代码语言:javascript
运行
复制
Student **ptrStudents;

这是Class对象的构造函数。现在,我对数组使用了任意大小的40。

代码语言:javascript
运行
复制
Class::Class()
{
Student **ptrStudents = new Student*[40];
}

下面是函数addStudents,它接受一个指向学生对象的指针作为它的参数。请注意,字符串名称是所有学生的数据字段。

代码语言:javascript
运行
复制
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;
}

下面是我正在使用的主要函数:

代码语言:javascript
运行
复制
int main ()
{
    Class Economics;
    Student student1("Hannah");
    Economics.addStudent(&student1);

    return 0;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-07 02:46:58

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

代码语言:javascript
运行
复制
Class::Class()
{
ptrStudents = new Student*[40];
for(int i = 0; i < 40; i++)
    ptrStudents[i] = 0;    //NULL
}

创建指针时,不会自动将其初始化为空。所以发生的情况是,你有一堆指向垃圾数据的随机指针,当你到达这行时

代码语言:javascript
运行
复制
if (ptrStudents[i] != 0)

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

糟糕,我漏掉了一个大问题,即使我复制了你的代码(谢谢你,John)。不应重新声明ptrStudents数组;这会在构造函数中创建一个局部数组,而不是初始化成员数组。

票数 0
EN

Stack Overflow用户

发布于 2013-04-07 02:50:16

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

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

这将声明一个局部变量,并使用新数组对其进行初始化。

将其更改为:

ptrStudents = new Student*[40];

票数 0
EN

Stack Overflow用户

发布于 2013-04-07 02:50:53

至少两个错误

首先,你应该将数组的值初始化为NULL (正如Parker Kemp所说)

其次,您在构造函数中声明了一个名为ptrStudents的局部变量,该变量隐藏了也称为ptrStudents的类变量。您应该删除该声明。所以就像这样

代码语言:javascript
运行
复制
Class::Class()
{
    ptrStudents = new Student*[40];
    for(int i = 0; i < 40; i++)
        ptrStudents[i] = 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15854667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档