【问题标题】:Access violation writing location while giving value to a struct访问冲突写入位置,同时为结构赋值
【发布时间】:2021-12-11 22:21:56
【问题描述】:

我试图在循环中为 2D 结构赋值,但我不断收到访问冲突写入位置错误 我的代码是:

typedef struct {
int prtcls[10],numb;
} intpos;
int main(int argc, char** argv)
{

particle_t* particles;
intpos** points = new intpos*[(int)SCALE];
for (int i = 0; i < (int)SCALE; i++) {

    intpos* row = new intpos[(int)SCALE - 1];
    points[i] = row;
}
cudaMallocHost(&particles, sizeof(particle_t)*NUM_PARTICLES);
// Random initial positions / directions.
for (int i = 0; i < NUM_PARTICLES; i++)
{
    particles[i].x =( (float)rand() / (float)RAND_MAX) * SCALE ;
    particles[i].y = ((float)rand() / (float)RAND_MAX) * SCALE;
    particles[i].phi = ((float)rand() / (float)RAND_MAX) * 2 * 3.14;
    particles[i].flrx = floor(particles[i].x) ;
    particles[i].flry = floor(particles[i].y) ;
    int fx = particles[i].flrx;
    int fy = particles[i].flry;
    points[fx][fy].numb += 1;
    int curn = points[fx][fy].numb;
    points[fx][fy].prtcls[curn] = i;
}

并且完整的错误是: 0xC0000005:访问冲突写入位置0x000001DEA3C7836C。

【问题讨论】:

  • operator new 建议您正在编写 C++ 代码,但其他一切看起来都像 C;然后你分配了 NUM_PARTICLES 个项目,但迭代了 18432 这个幻数。所以,不知道,试着清理一下,mcve 如果可能的话。
  • 虽然cudaMallocHost 建议它是一个 C++ CUDA 程序,但您显示的代码完全在 CPU 上运行。使用普通调试器或 valgrind 或消毒剂来查找错误。您访问某些数组 particlespoints 的概率为 99.99%,位于其边界之外。此外,在调试模式下编译代码并在调试器下运行它会为您提供程序段错误的确切行号。
  • 嗨。谢谢您的回答 。它在这一行:points[fx][fy].prtcls[curn] = i; .在我使用 cuda 进行计算的其余代码中,它也不是完整的代码。

标签: c++ struct physics


【解决方案1】:

什么线?如果您使用的是 GNU 工具,gdb 和堆栈跟踪会告诉您哪一行崩溃了。

我怀疑是以下几行之一:

particles[i].x =( (float)rand() / (float)RAND_MAX) * SCALE ;
points[fx][fy].numb += 1;
points[fx][fy].prtcls[curn] = i;

您确定所有这些数组索引值都在范围内吗?

【讨论】:

  • 嗨。谢谢您的回答 。它在这一行:points[fx][fy].prtcls[curn] = i; .我还检查了它对于 10 或 20 个值是否正常,但是当它到达某个索引(在数组范围内)时,它会向我显示这条消息。
  • 好吧,我不知道这段代码实际上想做什么,但这表明 curn 超出了范围。
  • 谢谢先生,我解决了。我给所有的 points[fx][fy].numb 都给了 0 并且它修复了它。显然没有这样做值是一些负数,所以它们超出了范围。
猜你喜欢
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2012-12-05
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多