0xC0000005:访问冲突写入位置c ++数组

时间:2013-01-15 10:09:05

标签: c++ arrays

我一直在使用c ++,并且出于某种原因,每次遇到在循环中访问的数组时它都会一直给我这个错误消息,例如:

int i2 = 0;
for(int n=0; n<sizeof(mapy); n++)
{   
  xybar[i2] = mapx[n] * mapy[n];//
  xbar_squared[i2] = mapx[n] * mapx[n];//
  i2++;
}

我意识到它不需要i2的原因是因为当我检查这些值时,我意识到迭代器n已被替换为值2006而不是数组中的位置导致它在下一个失败因为我的数组只包含500个数据,所以调用因为它超出了界限。我认为i2可能会解决这个问题,但事实并非如此。

2 个答案:

答案 0 :(得分:5)

我在此假设您的数组不是指针,例如它们是sometype mapy[size]而不是sometype *mapy。在这种情况下,sizeof运算符以字节为单位返回整个mapy数组的大小,而不是元素的数量。如果数组是任何大于1个字节的类型(例如intfloatdouble等),那么代码将访问数组的末尾,因此访问冲突异常。您可以使用sizeof(mapy)/sizeof(mapy[0])来获取数组元素的数量。

答案 1 :(得分:3)

sizeof是字节数,而不是数组的长度。如果mapy是普通指针,则该值在32位系统中可能为4,在64位系统中为8。如果这不是数组中元素的实际数量,则循环是错误的,如果数组中的元素数量较少,则超出边界。

如果mapy是一个实际的数组,它将是元素中数组的大小乘以每个元素的大小,所以除非元素类型为char,否则你肯定超越了在这种情况下的界​​限。

我们也看不到定义xybar和mapx的位置,但如果这是C ++,你应该考虑使用std::vector而不是数组。

顺便提一下,关于元素数量“调整”数组的一种方法是:

template< typename T, size_t N > 
size_t arraySize( T (arr&)[N] )
{
    return N;
}