C++ 未处理的异常访问c++;
我试图从一个向量中计算并添加一些值,然后将它们保存在一个新的向量中。我正在做一个循环。开始时代码运行良好,但后来我开始出现访问冲突错误。从我所读到的内容来看,在尝试使用未初始化指针时,通常会出现此错误。但是我使用的指针已经被统一化了。很抱歉代码太草率,因为我还在学习。任何可能导致错误的提示都将非常有用 代码如下:C++ 未处理的异常访问c++;,c++,visual-studio,C++,Visual Studio,我试图从一个向量中计算并添加一些值,然后将它们保存在一个新的向量中。我正在做一个循环。开始时代码运行良好,但后来我开始出现访问冲突错误。从我所读到的内容来看,在尝试使用未初始化指针时,通常会出现此错误。但是我使用的指针已经被统一化了。很抱歉代码太草率,因为我还在学习。任何可能导致错误的提示都将非常有用 代码如下: #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <ctime> #inc
#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;
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
#包括
#包括
#包括
使用名称空间std;
void MulCPU(int*c、const int*a、const int NDim、const int templateSize){
对于(int i=0;i
我想一定是循环把事情搞砸了。之前我也遇到了一个堆异常
调试器给了我:
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-1 + templateSize - 1 + (NDim-1)*NDim + (NDim-1)*(templateSize-1)
(NDim*NDim)-1 + NDim*(templateSize-1)
即:
NDim-1 + templateSize - 1 + (NDim-1)*NDim + (NDim-1)*(templateSize-1)
(NDim*NDim)-1 + NDim*(templateSize-1)
在阵列的末端运行良好
编辑:修复了偏移错误
for(int i=0;i
您的i
和k
都是从0
开始的,因此在第一次迭代中,当i=k=0
时,您试图访问c[0-1+(0-1)*NDim
,即c[-NDim-1]
。因此,基本上,在尝试计算要访问的元素的索引时,您正在执行一些无效的计算。您可以通过执行以下操作更正第一个错误:
c[i+k*NDim]=/*剩下的表达式*/
因为我不知道在此之后您希望实现什么索引,所以您需要了解自己。但这是困扰您的错误。调试器告诉了您什么?调试代码时您观察到了什么。抱歉,伙计们,忘记发布实际问题:SecondTest.exe中0x011B996B的未处理异常:0xC0000005:Access viola正在读取位置0x0199C0A4。这不是调试器消息。实际上,调试代码可以让您看到源代码中有问题的指令,然后检查相关变量并找出问题的根本原因。什么是
h_a
、h_c
和h_d
?