读取对象数组的c ++会导致SIGSEGV

时间:2014-04-25 20:38:21

标签: c++ arrays object sigsegv

我有两个课程:矢量和粒子......

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 行使其无误地工作。

此处的完整代码:http://codepad.org/dI2ve5Pc

为什么它会失败并且有办法解决它?

谢谢:)

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

请务必在j循环的每次迭代后将0重置为j

 do{
  do{
   if(i!=j){
    vi = *(particles[i]->coord);
    vj = *(particles[j]->coord); //FIXME
   }
  }while(
   ++j<PARTICLES //For values >1 throws SIGSEGV
  );

  // Reset j here
  j = 0;
  ///////////////

 }while(
  ++i<PARTICLES
 );