2013-01-15 48 views
0

我一直用C++,由于某种原因它不断给我这个错误信息,每次遇到一个阵列中的循环如被访问时间:0000005:访问冲突写入位置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已被值say 2006取代,而不是数组中的位置,导致它在下一次调用时失败,因为它出来了因为我的数组只包含500条数据。我认为i2可能会解决这个问题,但事实并非如此。

+9

mapy','xybar'和'xbar_squared'的'后定义。 – hmjd

+1

为什么你使用i2和n作为单独的循环计数器,如果它们以完全相同的方式进行更改? – tmaric

+6

这里有很多事情可能会导致这种情况,但我认为问题在于'sizeof'不符合您的想法。 mapy是什么类型的? –

回答

5

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

+4

'sizeof'技巧只有在'mapy'确实是一个数组,而不是一个指针时(即使在声明参数时使用数组语法时,作为参数传递的数组总是会变成指针的),'sizeof'技巧也能工作。 –

+0

请使用[函数模板](https://gist.github.com/3959946#file-arrays-h-L33)而不是sizeof计算阵列大小。 –

+2

实际上,如果map是一个用户定义的类型,它动态分配内存和/或包含额外的数据,如sizeof元素数的计数器,那么'sizeof'也会失败。 – Agentlien

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