1

このコードを実行していると、次のようなエラーが発生します

Run-Time Check Failure #2 - Stack around the variable 'temp' was corrupted

int main()
{
    UINT8 temp[7];
    for (int i = 0; i <= 7; i++)
    {
        temp[i] = 0x01;
    }
    return 0;
}//The error falls here

私を助けてください。

4

7 に答える 7

3

境界外の配列にアクセスしています

変化する:

for (int i = 0; i <= 7; i++)

for (int i = 0; i < 7; i++)

またはより C++ の方法:

std::fill_n(temp, 7, 0x01);  
于 2013-01-18T10:10:54.767 に答える
2

tempis7と for ループのサイズが要素に到達し、8要素に到達しない7

変化する

for (int i = 0; i <= 7; i++)

for (int i = 0; i < 7; i++)

c の配列インデックスは 0 から始まります。したがって、配列のインデックス 0 からインデックス 7 に移動すると、配列の8th要素に到達することを意味しますが、配列のサイズは 7 です。

于 2013-01-18T10:10:27.787 に答える
2

サイクルは7を除外する必要があります-配列のサイズは7であるため、インデックス7の要素はありません。

于 2013-01-18T10:10:37.030 に答える
2

UINT8 temp[7] を宣言します。7 つの変数の配列を作成します。temp[0] から temp[6] まで

ただし、 for ループは未定義の temp[7] にアクセスしようとします。以下のループが機能します

for (int i = 0; i < 7; i++)
{
    temp[i] = 0x01;
}
于 2013-01-18T10:11:35.930 に答える
1

配列には 7 つの要素 ([0..6]) があり、for ループは 8 つの要素 [0..7] にアクセスしようとするため、スタックが破損します。

于 2013-01-18T10:11:19.300 に答える
1
for (int i = 0; i < 7; i++)
{
    temp[i] = 0x01;
}

これはあなたを助けるでしょう..あなたは再び一時に書き戻しています..それはあなたが得ているエラーです

于 2013-01-18T10:15:52.637 に答える
0

C および C++ では、配列インデックスは 0 ベースであることに注意してください。したがって、N項目の配列がある場合、有効なインデックス値は 0,1,2,...,( N -1) です。

あなたの場合、N = 7 なので、有効なインデックス値は 0,1,2,3,4,5,6 です。

したがって、 for ループで次のように置き換え<=ます<

UINT8 temp[7];
for (int i = 0; i < 7; i++)  // Use <, not <=
 ....

さらに、 VS in で利用できる便利な_countof()マクロがあり、コードの読み取り保守<stdlib.h>が容易になります(ループ内で「マジック ナンバー」7 を使用する代わりに)。for

for (int i = 0; i < _countof(temp); i++)

を使用し_countof()て、配列のサイズを変更しても、7 を新しい配列サイズに変更しなくても、ループ コードは機能します。

また、C++11 では範囲ベースの for ループを使用できることにも注意してください(ただし、この質問でタグとして使用した VC10/Visual Studio 2010 では使用できません)。

指定されたバイト シーケンスでバッファを埋めたい場合は、memset(C のような方法で)使用できることに注意してください。

memset(temp, 0x01, sizeof(temp));

または、より一般的には (1 バイトを超える要素の場合でも)、以下std::fillからC++ を使用でき<algorithm>ます。

fill(begin(temp), end(temp), 0x01);

のような明示的なアルゴリズムを使用するstd::fillと、ソース コードの「セマンティック レベル」が上がるため、コードが読みやすくなります (意味を解釈する必要がある「生の」ループを読み取る代わりに、「 fill 」を読み取るだけです)。for

于 2013-01-18T10:21:50.823 に答える