0

我遇到了段错误,当我调试它时,我收到以下消息:

无法访问 0x806d128 处的内存

我试图在那里设置一个观察点来监控地址,但 gdb 给我的响应是:

无法观看常量值“0x806d128”

但是,当我打印包含地址的指针时,它会识别出我存储在那里的结构:

(正文 *)0x806d128

根据 gdb,错误发生在 中addForce(),这有点奇怪,因为该地址是在之前访问的init()

以下是相关代码:

#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define prec float

prec gdt = 0.0001;

typedef struct {
  float Fx, Fy, vx, vy, mass;
  int posX, posY;
} body;


void addForce(body* a, body* b){
  int xa=(*a).posX, ya=(*a).posY;
  int xb=(*b).posX, yb=(*b).posY;
  float F=(*a).mass * (*b).mass * gdt /(pow(xa-xb, 2)+pow(ya-yb, 2));
  float v=atan((ya-yb)/(xa-xb));
  float Fx=cos(v)/F, Fy=sin(v)/F;
  (*a).Fx+=Fx;
  (*a).Fy+=Fy;
  (*b).Fx-=Fx;
  (*b).Fy-=Fy;
}


int newRandInt(int bot, int top){
  return bot + (rand() % (top++));
}

prec newRand() 
{
    prec r = (prec)((double)rand()/(double)RAND_MAX);
    return r;
}


void init(int N, body* star){
  for(int i=0; i<N;i++){
    star[i].posX = newRandInt(0, 800);
    star[i].posY = newRandInt(0, 800);

    star[i].Fx = newRand();
    star[i].Fy = newRand();

    star[i].vx = newRand();
    star[i].vy = newRand();

    star[i].mass = newRand();
  }
}

int main(int argc, char* argv[]) {

    int N = 200;

body* stars = malloc(sizeof(body)*N);

init(N, stars);
for(int j1=0; j1<N; j1++){
  for(int j2=0; j2<N-1; j2++){
    if(j1!=j2){
      addForce(stars+sizeof(body)*j1, stars+sizeof(body)*j2);
    }
  }
}
return 0;

}

4

2 回答 2

0

这个调用addForce不是你想要的:

addForce(stars+sizeof(body)*j1, stars+sizeof(body)*j2);

您不希望sizeof(body)此调用中的表达式对addForce. 您可能想要的电话是:

  addForce(stars+j1, stars+j2);

stars是一个数组,body因此您可以使用

body *p = &stars[i]

要不就

body *p = stars + i

这两个都有类型 body*

于 2013-09-19T14:56:50.593 回答
0

在这一行:

addForce(stars+sizeof(body)*j1, stars+sizeof(body)*j2);

当你这样做时,sizeof(body)它以字节为单位计算结构的大小,然后乘以j1. 所以你有some_nr*j1.
该值added指向stars,即指向body 的指针。
指针算术评估some_nr*j1*sizeof(pointer to body).
你想要做的只是stars+j1一个人,它将被正确地评估为指向 body 的指针并添加到数组中。
addForce 的第二部分也发生了同样的情况。

您错过的是,使用指针算术,“+”运算符的第二个操作数被重新计算以匹配指针的大小。

于 2013-09-19T15:07:55.660 回答