Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++读取对象数组导致SIGSEV_C++_Arrays_Object_Segmentation Fault - Fatal编程技术网

C++读取对象数组导致SIGSEV

C++读取对象数组导致SIGSEV,c++,arrays,object,segmentation-fault,C++,Arrays,Object,Segmentation Fault,我有两类:向量和粒子 class Vector { public: float x,y; }; class Particle { public: Vector* coord; Particle(Vector* coord) { this->coord = coord; }; }; 。。。一个数组声明如下: Particle* particles [PARTICLES]; 这是我的主要观点: int main(int argc,

我有两类:向量和粒子

class Vector {
public:
    float x,y;
};

class Particle {
public:
    Vector* coord;
    Particle(Vector* coord)
    {
        this->coord = coord;
    };
};
。。。一个数组声明如下:

Particle* particles [PARTICLES];
这是我的主要观点:

int main(int argc, char** argv)
{
    //Write
    int i = 0;
    do{
        particles[i] = new Particle(new Vector());
    }while(
           ++i<PARTICLES
           );
    i = 0;

    //Read
    int j = 0;
    float s = .0f,
    a = .0f;
    Vector vi = *(particles[0]->coord),
    vj = *(particles[0]->coord);
    do{
        do{
            if(i!=j){
                vi = *(particles[i]->coord);
                vj = *(particles[j]->coord); //FIXME
            }
        }while(
               ++j<PARTICLES //For values >1 throws SIGSEGV
               );
    }while(
           ++i<PARTICLES
           );

    return 0;
}
每当粒子>1时,将抛出SIGSEGV。注释出FIXME行可以使它无误地工作

完整代码如下:

为什么它会失败?有没有办法修复它


谢谢:

循环写入错误。在内部循环的第二次迭代之前,j不会重置。为什么不像大多数人通常做的那样对循环进行编码:

for (i = 0; i < PARTICLES; i++) {
    for (j = 0; j < PARTICLES; j++) {
        // ...
    }
}

循环写入错误。在内部循环的第二次迭代之前,j不会重置。为什么不像大多数人通常做的那样对循环进行编码:

for (i = 0; i < PARTICLES; i++) {
    for (j = 0; j < PARTICLES; j++) {
        // ...
    }
}
记住在每次重复j循环后将j重置为0:

记住在每次重复j循环后将j重置为0:


我正在使用gpp编译,使用以下命令:g++teh_problem.cpp-o解决问题的方法是使用手动内存管理退出,并开始使用std::vector。为什么在循环编码时首先使用std::vector会让我头晕目眩?为什么不在循环中简单地增加i?为什么要让它成为while条件的一部分?你有没有使用C++来代替C++的特殊原因?当然,你不应该为一个点坐标向量命名你的类。有一个名为vector的标准库类,应该用于粒子数组。您不应该对coord成员变量使用动态内存。这只会给你带来不可读性和内存管理的噩梦。我正在用gpp编译这个命令:g++teh_problem.cpp-o解决这个问题的方法是停止使用手动内存管理,开始使用std::vector。为什么先用循环编码的方式让我头晕目眩?为什么不在循环中简单地增加i?为什么要让它成为while条件的一部分?你有没有使用C++来代替C++的特殊原因?当然,你不应该为一个点坐标向量命名你的类。有一个名为vector的标准库类,应该用于粒子数组。您不应该对coord成员变量使用动态内存。这只会给你带来不可读性和内存管理的噩梦。