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、配列ではなく使用を検討する必要があります。

ちなみに、要素数に関して配列を「サイズ変更」する1つの方法は次のとおりです。

template< typename T, size_t N > 
size_t arraySize( T (arr&)[N] )
{
    return N;
}
于 2013-01-15T10:13:55.857 に答える