未处理的异常访问C++中的循环冲突
问题描述:
我正在计算从一个向量中添加一些值并将它们保存在一个新的向量中。我正在做for循环。在开始的代码工作正常,但后来我开始越来越acces违规错误。从我读的内容来看,当尝试使用一个未初始化的指针时,你通常会得到这个错误。但是我使用的指针已经单元化了。我很抱歉这个草率的代码,因为我还在学习。任何暗示什么可能导致错误将非常感谢。未处理的异常访问C++中的循环冲突
下面是代码:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <ctime>
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
void MulCPU(int *c, const int *a, const int NDim, const int templateSize){
for (int i = 0; i < NDim; i++){
for (int k = 0; k < NDim; k++){
c[i - 1 + (k - 1)*NDim] = a[i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)] - a[i - 1 + (k)*NDim + k*(templateSize - 1)] - a[i + templateSize - 2 + (k - 2)*NDim] + a[i - 2 + (k - 2)*NDim];
}
}
}
int main()
{
srand(time(NULL));
int N = 500;
int SIZE = N*N;
int *h_b = new int[SIZE];
int *h_e = new int[SIZE];
int templateSize = 3;
// ...
// Code for defining h_b
// ...
int StartTime = clock();
MulCPU(h_e, h_b, N, templateSize);
int StopTime = clock();
delete[] h_a, h_b, h_c, h_d, h_e;
我想这一定是某种方式食堂的事情了循环。早期我遇到了堆异常...
调试器给我: SecondTest.exe中0x011B996B未处理的异常:0xC0000005:访问冲突读取地址0x0199C0A4。
答
你有许多问题:
c[i - 1 + (k - 1)*NDim] =
a[i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)] -
a[i - 1 + (k)*NDim + k*(templateSize - 1)] -
a[i + templateSize - 2 + (k - 2)*NDim] +
a[i - 2 + (k - 2)*NDim];
当i
和k
都为0,你会写信给C [-501]。这不太可能结束。 (特别是你可能会覆盖该是内部堆指针,当你释放内存会导致各种混乱的。)
此外,当i
和k
都是NDIM-1
,那么第一个索引a
是
i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)
它是:
它是:
(NDim*NDim)-1 + NDim*(templateSize-1)
它在阵列末端运行良好。
编辑:固定偏移错误。
答
for (int i = 0; i < NDim; i++){ for (int k = 0; k < NDim; k++){ c[i - 1 + (k - 1)*NDim] = a[i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)] - a[i - 1 + (k)*NDim + k*(templateSize - 1)] - a[i + templateSize - 2 + (k - 2)*NDim] + a[i - 2 + (k - 2)*NDim]; } }
你i
和k
都开始在0
,所以在第一次迭代本身时i=k=0
,您试图访问c[0-1+(0-1)*NDim]
,这是c[-NDim-1]
。所以基本上你在计算你想要访问的元素的索引时做了一些无效计算。您可以通过执行修正的第一个错误:
c[i + k*NDim] = /*your remaining expression*/
因为我不知道你想以后达到什么指标,你需要弄清楚自己。但是,这是错误的,正在扰乱你。
你的调试器告诉你什么? –
你观察调试你的代码是什么。 –
对不起,忘了发布实际问题:在SecondTest.exe 0x011B996B未处理的异常:0xC0000005:访问冲突读取位置0x0199C0A4。 – LukaK