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

     2023-02-21     74

关键词:

【中文标题】添加指向数组的指针时出现分段错误【英文标题】: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];

【讨论】:

使用指向指针 C++ 的指针时出现分段错误

】使用指向指针C++的指针时出现分段错误【英文标题】:segmentationfaultwhenusingpointertopointerC++【发布时间】:2015-11-0920:29:49【问题描述】:我一直在尝试使用指向指针的指针来执行类似于树中的中序遍历的操作。这是我的代码struct... 查看详情

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

...6-11-2817:06:12【问题描述】:我是C++新手,我正在尝试使用指向指针的指针构建一个3维数组。我确信有更有效的方法可以做到这一点,但我目前正在尝试理解指针。作为示例代码,我最初有以下部分,它工作正 查看详情

尝试从方法返回指向对象的指针时出现分段错误

】尝试从方法返回指向对象的指针时出现分段错误【英文标题】:Segmentationfaultwhiletryingtoreturnapointertoobjectfromamethod【发布时间】:2016-06-0611:06:21【问题描述】:g++在我尝试从classA的方法返回classB的对象时抛出“分段错误”。我不... 查看详情

尝试使用指向 char* 的指针时出现总线错误 10 或分段错误 11,具体取决于封装

】尝试使用指向char*的指针时出现总线错误10或分段错误11,具体取决于封装【英文标题】:buserror10orsegmentationfault11whentryingtousepointerstochar*dependingonencapsulation【发布时间】:2014-09-1606:38:48【问题描述】:我正在尝试使用基本char*并... 查看详情

使用/指针创建 3D 数组时出现分段错误(核心转储)

】使用/指针创建3D数组时出现分段错误(核心转储)【英文标题】:SegmentationFault(CoredDumped)WhenCreating3DArrayw/Pointers【发布时间】:2014-01-2502:44:29【问题描述】:提前感谢您的帮助!我目前正在阅读AlexAlllain的“JumpingintoC++”,到目... 查看详情

返回指针时出现分段错误[关闭]

...到了Segfault。我读过其他类似的问题,但OP正在返回一个指向局部变量的指针。在这里,我实际上是在返回一个本地指针。s 查看详情

删除时出现分段错误

...树时出现。这段代码很简单,我有一个Node类,其中包含指向其子节点的指针。#include<vector>classNodepublic:intdata1,data2;std::vector& 查看详情

使用指向具有 unordered_map 作为成员的类的指针时出现段错误

】使用指向具有unordered_map作为成员的类的指针时出现段错误【英文标题】:Segfaultwhenusingpointertoclasswithunordered_mapasmember【发布时间】:2016-08-2509:39:39【问题描述】:我正在尝试实现我自己的类,它有一个unordered_map作为成员。现... 查看详情

指针数组的分段错误

】指针数组的分段错误【英文标题】:segmentationfaultwithpointerarray【发布时间】:2018-06-0623:10:33【问题描述】:尝试为我的指针数组输入数据时出现段错误。我对编码很陌生,所以任何帮助都会很棒。我的任务是创建一个指针数组... 查看详情

返回指针时出现分段错误

】返回指针时出现分段错误【英文标题】:Segmentationfaultwhenreturningapointer【发布时间】:2013-10-2902:55:56【问题描述】:我正在尝试用C语言编写一个可以获取环境变量的代码,然后使用strstr从该结果中搜索特定的单词。我正在使用... 查看详情

在 C 中创建大型数组时出现分段错误

】在C中创建大型数组时出现分段错误【英文标题】:SegmentationFaultWhileCreatingLargeArraysinC【发布时间】:2013-02-2309:08:12【问题描述】:你们用这段代码帮了我很多。让我先说我不太了解C,并且正在努力做到这一点。这是程序应该... 查看详情

将值分配给指针C++时出现分段错误

】将值分配给指针C++时出现分段错误【英文标题】:SegmentationFaultwhenassigningvaluetoapointerC++【发布时间】:2020-07-2110:59:35【问题描述】:当我运行以下并行代码时,我在第18行(两次打印之间)的分配处遇到分段错误。我真的不明... 查看详情

在调用函数中取消引用指针时出现分段错误

】在调用函数中取消引用指针时出现分段错误【英文标题】:Segmentationfaultwhiledereferencingthepointerinthecallingfunction【发布时间】:2018-02-2306:10:45【问题描述】:当我运行以下代码时,我得到了分段错误错误,我无法纠正我的错误。v... 查看详情

为啥在访问二级指针时出现分段错误错误? C语言

】为啥在访问二级指针时出现分段错误错误?C语言【英文标题】:Whyamigettingsegmentationfaulterrorwhileaccessingasecondlevelpointer??Clanguage为什么在访问二级指针时出现分段错误错误?C语言【发布时间】:2021-06-2102:18:43【问题描述】:以下... 查看详情

在指针迭代中使用 for 循环时出现分段错误

】在指针迭代中使用for循环时出现分段错误【英文标题】:Segmentationfaultwhileusingforloopinpointeriteration【发布时间】:2018-07-1708:30:45【问题描述】:这是我编写的一小段代码,用于测试我对指针的了解:int*grades;*(grades+0)=100;*(grades+1)... 查看详情

为啥在尝试使用指针访问结构时出现此分段错误?

】为啥在尝试使用指针访问结构时出现此分段错误?【英文标题】:whyamigettingthissegmentationfaultwhentryingtoaccessastructusingapointer?为什么在尝试使用指针访问结构时出现此分段错误?【发布时间】:2020-12-1206:21:22【问题描述】:我正... 查看详情

处理二维数组时出现分段错误[关闭]

】处理二维数组时出现分段错误[关闭]【英文标题】:SegmentationFaultwhendealingwith2DArrays[closed]【发布时间】:2019-03-0510:49:57【问题描述】:我正在尝试动态创建二维数组,然后应该对其进行迭代以检查其内容。每当我尝试使用索引... 查看详情

删除模板数组时出现分段错误[重复]

】删除模板数组时出现分段错误[重复]【英文标题】:Segmentationfaultwhendeletingtemplatearray[duplicate]【发布时间】:2020-06-3015:48:05【问题描述】:所以我需要创建一个包含对象对的动态大小数组,并且我有以下代码:#include<utility>... 查看详情