c ++中循环的未处理异常访问冲突

时间:2016-03-02 11:08:06

标签: c++ visual-studio

我正在尝试计算从一个向量中添加一些值并将它们保存在一个新向量中。我在for循环中这样做。在开始时代码工作正常,但后来我开始获得访问冲突错误。根据我的阅读,在尝试使用未初始化的指针时,通常会出现此错误。但我正在使用的指针已被酉化。对于草率的代码我很抱歉,因为我还在学习。任何可能导致错误的暗示都会非常值得赞赏。

以下是代码:

#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。

2 个答案:

答案 0 :(得分:0)

你有很多问题:

            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];

ik均为0时,您将写入c [-501]。这不太可能结束。 (特别是你可能会覆盖堆内部的指针,当你释放内存时会造成各种各样的破坏。)

此外,当ik都是NDIM-1时,a的第一个索引是

i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)

是:

NDim-1 + templateSize - 1 + (NDim-1)*NDim + (NDim-1)*(templateSize-1)

是:

(NDim*NDim)-1 + NDim*(templateSize-1)

在数组末尾运行良好。

编辑:修复偏移错误。

答案 1 :(得分:0)

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];
    }
}

您的ik都从0开始,所以在i=k=0的第一次迭代中,您正在尝试访问c[0-1+(0-1)*NDim],这是c[-NDim-1]。所以基本上你在尝试计算你想要访问的元素的索引时做了一些无效的计算。您可以通过执行以下操作来纠正第一个错误:

c[i + k*NDim] = /*your remaining expression*/

由于我不知道您希望在此之后实现哪些索引,因此您需要弄清楚自己。但这是错误的错误。