【发布时间】: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 或消毒剂来查找错误。您访问某些数组particles或points的概率为 99.99%,位于其边界之外。此外,在调试模式下编译代码并在调试器下运行它会为您提供程序段错误的确切行号。 -
嗨。谢谢您的回答 。它在这一行:points[fx][fy].prtcls[curn] = i; .在我使用 cuda 进行计算的其余代码中,它也不是完整的代码。