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

     2023-02-16     252

关键词:

【中文标题】在 C++ 中使用指针的数组:访问返回的数组时出现分段错误【英文标题】:arrays using pointers in c++: segmentation fault when accessing the returned array 【发布时间】:2016-11-28 17:06:12 【问题描述】:

我是 C++ 新手,我正在尝试使用指向指针的指针构建一个 3 维数组。我确信有更有效的方法可以做到这一点,但我目前正在尝试理解指针。

作为示例代码,我最初有以下部分,它工作正常,分配、初始化和释放内存。

void builder(int aSize1, int aSize2, int aSize3)

    int i1, i2, i3;
    int ***frequencies;

    cout << "allocation started ..." << endl;
    frequencies = new int** [aSize1+1];
    for (i1=0; i1<=aSize1; i1++)
        frequencies[i1] = new int*[aSize2+1];
        for (i2 = 0; i2 <= aSize2; i2++)
        
            frequencies[i1][i2] = new int [aSize3 + 1];
        
    
    cout << "allocation done" << endl;
    cout << " " << endl;

    cout << "before initialization" << endl;
    for (i1=0; i1<=aSize1; i1++)
        for(i2=0; i2<=aSize2; i2++)
            for(i3 = 0; i3 <= aSize3; i3++)
            
                frequencies[i1][i2][i3]= (i1 * i2) % 10;
            
        
    
    cout << "after initialization" << endl;
    cout << " " << endl;

    /* the "destroyer" part */

    cout << "deleting ..." << endl;

    for (i1=0; i1<=aSize1; i1++)
        for(i2=0; i2<=aSize2; i2++)
            delete [] frequencies[i1][i2];
        
    

    for (i1=0; i1<aSize1; i1++)
        delete [] frequencies[i1];
    
    delete [] frequencies;
    cout << "deleting done" << endl;


我想通过将上面的代码分成几个部分来提高赌注,这样我就可以在我的程序的main() 函数中使用初始化的数组(只是想看看我是否也可以在那里访问它们)。所以,我最终做了以下

头文件:

void builder(int aSize1, int aSize2, int aSize3, int*** frequencies)

    int i1, i2, i3;
    //int ***frequencies;

    cout << "allocation started ..." << endl;
    frequencies = new int** [aSize1+1];
    for (i1=0; i1<=aSize1; i1++)
        frequencies[i1] = new int*[aSize2+1];
        for (i2 = 0; i2 <= aSize2; i2++)
        
            frequencies[i1][i2] = new int [aSize3 + 1];
        
    
    cout << "allocation done" << endl;
    cout << " " << endl;

    cout << "before initialization" << endl;
    for (i1=0; i1<=aSize1; i1++)
        for(i2=0; i2<=aSize2; i2++)
            for(i3 = 0; i3 <= aSize3; i3++)
            
                frequencies[i1][i2][i3]= (i1 * i2) % 10;
            
        
        cout << **(frequencies[i1]+2) << endl;
    
    cout << "after initialization" << endl;
    cout << " " << endl;



void destroyer( int aSize1, int aSize2, int aSize3, int*** frequencies )

    int i1, i2;

    cout << "deleting ..." << endl;

    for (i1=0; i1<=aSize1; i1++)
        for(i2=0; i2<=aSize2; i2++)
            delete [] frequencies[i1][i2];
        
    

    for (i1=0; i1<aSize1; i1++)
        delete [] frequencies[i1];
    
    delete [] frequencies;
    cout << "deleting done" << endl;

还有我的main(),在那里我尝试访问 3d 数组,但徒劳无功。

int main()

    int aSize1 = 10;
    int aSize2 = 10;
    int aSize3 = 10;
    int*** freq;

    builder(aSize1, aSize2, aSize3, freq);
    cout << "builder finished" << endl;
    cout << **(freq[1]+2) << endl;
    destroyer( aSize1, aSize2, aSize3, freq);

当我编译它时,“builder”函数运行良好,但每当我尝试访问主函数中的 3d 数组时都会出现分段错误。我希望这能起作用,因为我在书中读到过,如果使用指向函数的指针通过引用传递某些内容,则该函数将有权操作它。另外,我预计我需要取消对 3d 数组的引用 3 次(即 ***freq)才能正确访问元素,但编译器因为我试图这样做而生气并脱口而出

myBuilder.cpp:42:17: 错误:间接需要指针操作数('int' 无效) cout

我知道这是一个新手问题,但我们将不胜感激!

【问题讨论】:

我强烈建议你学习使用正确的 C++ 容器(std::vectorstd::array 等)而不是简单的 C 样式数组和动态内存分配等 - 否则你只是在扔抛开 C++ 的所有优点,你还不如用 C 编程。 “如果使用指针通过引用传递某些内容” 并且代码中带有手动内存管理的指针业务表明您应该投资一本更好的书。 我正在使用 Dietel 的书。它不鼓励我进行手动内存管理,但我只是对自己很好奇,想通过一个具有挑战性的例子来更好地理解指针(至少对我来说)。 【参考方案1】:

builderdestroyer 中的frequencies 指针是mainfreq 指针的副本。所以在builder 中设置它不会改变main 中的(未初始化的)指针。你想要一个对指针的引用:

void builder(int aSize1, int aSize2, int aSize3, int***& frequencies);

对于您的间接级别,请注意如果freqint***,那么freq[1]int**

【讨论】:

【参考方案2】:

在代码中,当您从 main() 调用 builder(aSize1, aSize2, aSize3, freq); 时,您传递的是 int ***frequencies(自开始以来就包含垃圾值)并希望在构建器函数调用中更新此三元组指针。

构建器函数分配内存并更新在下面代码行中的构建器函数调用中作为参数传递的 ***frequecny 的副本

frequencies = new int** [aSize1+1];

因此,它是对频率指针的按值调用,在调用builder完成后不会在main()中更新返回。它仍然包含垃圾地址,被访问会导致分段错误。

您需要在构建器调用中传递频率指针的地址,如 &frequencies,并在构建器函数中进行相应的更改。

【讨论】:

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

...始化一个指向Student对象的指针数组(pStudents)(我不能使用向量),初始化为null。当我使用函数addStudent将学生添加到班级时,我希望能够在指针数组中 查看详情

在 C++ 中使用向量时出现分段错误?

】在C++中使用向量时出现分段错误?【英文标题】:SegmentationfaultwhileusingvectorinC++?【发布时间】:2017-05-1513:30:28【问题描述】:为什么我在以下代码中遇到分段错误?此代码以第一个元素为0的数组s开始。然后是元素与s互补的数... 查看详情

在 C++ 中使用链表时出现空指针异常

】在C++中使用链表时出现空指针异常【英文标题】:NullPointerexceptionwhileusingLinkedListinc++【发布时间】:2021-12-0914:42:07【问题描述】:我遇到了“读取访问冲突”或“分段错误”的错误。这是我的代码:#include<iostream>usingnamespa... 查看详情

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

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

如何使用 ctypes 将数组从 C++ 函数返回到 Python

】如何使用ctypes将数组从C++函数返回到Python【英文标题】:HowtoreturnarrayfromC++functiontoPythonusingctypes【发布时间】:2013-01-3023:53:56【问题描述】:我正在使用ctypes在Python中实现一个C++函数。C++函数应该返回一个指向数组的指针。不... 查看详情

为什么在尝试将指向数组的指针作为函数的参数时出现访问冲突错误?(代码片段)

...个类似的问题请注意,您还可以在参数中指定数组的大小使用friday[i]而不是*(friday+i)更具可读性第一种可能是添加空值来标记数组的结尾:#include<stdio.h>i 查看详情

如何通过 C++ 中指向该数组的指针访问另一个类中的数组?

...通常为了从不同的类访问一个类/对象的成员变量,您会使用箭头运算符(->)。在这种情况下,我想访问一个数组,但是数组的大小只有在运行时才知道,因此我不能在类的头文件中声明数组。其 查看详情

无法从函数返回的变量索引到空数组,或访问返回的正则表达式数据时出现问题

】无法从函数返回的变量索引到空数组,或访问返回的正则表达式数据时出现问题【英文标题】:Cannotindexintonullarrayfromfunctionreturnedvariable,orissuesaccessingregexdatareturned【发布时间】:2022-01-1918:35:51【问题描述】:我不确定我是否从... 查看详情

在数组上使用匹配时出现问题

】在数组上使用匹配时出现问题【英文标题】:Troublewhenusingmatchonanarray【发布时间】:2013-11-0622:11:08【问题描述】:我想做的是创建一个可以将数组作为参数的方法。数组中应该有一些数字。该方法将返回数组包含其中每个数字... 查看详情

C ++在指向结构的指针中访问类数组指针

...了所有的C++教程、***帖子和GSL文档,但没有成功。我正在使用犰狳包进行矩阵 查看详情

使用基类中定义的函数返回指向派生类实例的指针时出现无效转换错误

】使用基类中定义的函数返回指向派生类实例的指针时出现无效转换错误【英文标题】:Invalidconversionerroronreturningapointertoinstanceofaderivedclassusingfunctiondefinedinthebaseclass【发布时间】:2014-02-1501:06:19【问题描述】:这可能是一个微... 查看详情

c++指针与数组(代码片段)

C++指针与数组的关系。如何传递数组参数。如何返回数组参数。前言C,C++的指针和数组的联系非常紧密。数组的真正面目是什么?如何传递一个数组到函数中?为什么可以这么访问数组?函数如何返回多个返回值?这些问题老生... 查看详情

在 C++ 中动态创建二维数组时出现问题。这是代码。它不适用于某些特定条件

】在C++中动态创建二维数组时出现问题。这是代码。它不适用于某些特定条件【英文标题】:Problemwhilecreating2DarraydynamicallyinC++.Hereisthecode.Itdosen\'tworkforsomespecificconditions【发布时间】:2021-07-0112:53:31【问题描述】:在我的以下代... 查看详情

使用 C++ 创建大型二维动态数组时出现分段错误(核心转储)

】使用C++创建大型二维动态数组时出现分段错误(核心转储)【英文标题】:Segmentationfault(coredump)whencreatingalarge2ddynamicarrayusingc++【发布时间】:2019-03-3012:57:02【问题描述】:我正在尝试创建一个程序,该程序创建两个2d动态数组... 查看详情

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

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

C++ char 指针数组 - 无法访问元素

...印它们;但是我的数组中似乎没有任何内容。注意我不能使用数组表示法进行这个赋值,我必须使用指针表示 查看详情

在 C++ 中使用指向数组中对象的指针会更好吗?

】在C++中使用指向数组中对象的指针会更好吗?【英文标题】:IsitbettertousepointerstoobjectsinanarrayinC++?【发布时间】:2016-03-2616:28:27【问题描述】:我正在涉足C++并试图将我的头脑围绕在指针的事情上。创建对象数组时,创建对象... 查看详情

将数组移交给 C# 中动态加载的 C++ DLL 时出现 System.AccessViolationException

】将数组移交给C#中动态加载的C++DLL时出现System.AccessViolationException【英文标题】:System.AccessViolationExceptionwhenhandinganarrayovertoadynamicallyloadedc++DLLinC#【发布时间】:2020-06-0116:23:32【问题描述】:我在C#程序中动态加载最初用C++编写... 查看详情