我的动态数组有问题 - 线程 1:EXC_BAD_ACCESS (code=1, address=0x0)

Posted

技术标签:

【中文标题】我的动态数组有问题 - 线程 1:EXC_BAD_ACCESS (code=1, address=0x0)【英文标题】:Problem with my dynamic array - Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) 【发布时间】:2020-04-02 22:13:23 【问题描述】:

我在调试时遇到问题:Xcode 给出:

线程 1:EXC_BAD_ACCESS(代码=1,地址=0x0)

我认为这是我的动态数组的问题...

我的任务是用点计算多边形的周长。

所以,我的程序接收点(x 和 y)来填充 Points 的数组,然后我创建了另一个数组 distance,我填充了所有距离,然后我可以计算周长。

我不知道是不是很清楚,但我是C++的初学者。

#include <iostream>
#include "Point.h"
#include "Polygone.h"
using namespace std;
int main() 
    int numberSide;
    int x,y;
    Point* array = nullptr;
    Polygone myPolygone;
    cout<<"enter number of sides:"<<endl;
    cin>>numberSide;
    float* distance=new float[numberSide];
    cout<<"enter points:"<<endl;
    for (int i=0; i<numberSide; i++) 
        cin>>x>>y;
        Point p(x,y);
        array[i]=p;
    
    for (int i=0; i<numberSide-1; i++) 
        distance[i]=array[i].distance(array[i+1]);
    
    distance[numberSide]=array[0].distance(array[numberSide]);
    myPolygone.perimeter(distance);
    delete [] distance;

    return 0;

【问题讨论】:

【参考方案1】:

您实际上从未为array 变量分配任何空间——您只是声明它并为其分配nullptr 值。因此,当您稍后尝试执行 array[i]=p; 时,您会尝试取消引用空指针,这会导致您的 EXC_BAD_ACCESS 错误。

要解决此问题,您需要分配数组,一旦您知道它的大小(即多边形有多少边)。您应该以与分配 distance 数组相同的方式执行此操作:

    cin>>numberSide;
    float* distance=new float[numberSide];
    Point* array = new Point[numberSide]; // And you should delete the earlier "Point* array = nullptr;` line

当然,你也需要在完成后释放内存:

    delete [] distance;
    delete [] array;
    return 0;

但是,当您使用 C++ 时,比使用原始指针和 new 运算符更好的方法是使用标准模板库的 std::vector container,它负责所有分配和在内部释放操作。以下是相关的“替换”行:

#include <vector> // This header defines the `std::vector` container
//...
    cin>>numberSide;
    std::vector<float> distance(numberSide);
    std::vector<Point> array(numberSide); 

然后你不需要delete[] 行,因为当向量“超出范围”时,向量的内存将自动释放。此外,您不需要真正更改任何其他代码,因为 std::vector 类有一个 [] 运算符,它可以按照您的意愿工作。

【讨论】:

以上是关于我的动态数组有问题 - 线程 1:EXC_BAD_ACCESS (code=1, address=0x0)的主要内容,如果未能解决你的问题,请参考以下文章

错误:“线程 1:EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)

动态数组获取“错误代码未指定启动失败”

在主 UiViewController 中动态声明子 UiViewController

OpenMP 多线程更新同一个数组

如何在内核中动态分配数组?

如何在内核中动态分配数组?