0

我一直在使用 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 可能会解决这个问题,但它没有。

4

2 回答 2

5

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

于 2013-01-15T10:12:06.263 回答
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;
}
于 2013-01-15T10:13:55.857 回答