我在进行调试时遇到问题:Xcode提供:
Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
我认为我的动态数组有问题...
我的任务是计算具有点的多边形的周长。
因此,我的程序接收到点(x和y)来填充
Point
s数组,然后创建另一个数组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;
}
最佳答案
您实际上并没有为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[]
行,因为当 vector “超出范围”时, vector 的内存将自动释放。另外,您不需要真正更改任何其他代码,因为std::vector
类具有[]
运算符,该运算符可以按您希望的那样工作。
关于c++ - 我的动态数组出现问题-线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61002007/