2

を使用して数字の0から9をASCIIに変換しようとして_itoa_sいますが、MSVC2012を使用してスタック破損エラーが発生しています。

ASCIIテーブルは1文字あたり1バイトしか占めていないと思いましたが、見た目からすると1バイトでは足りません。

私の考えはどこが間違っていますか?

for (int digit = 0; digit < 10; digit++)
{
  char ch_digit;
  _itoa_s(digit, &ch_digit, 1, 10); 
}

この単純なループは成功するはずだと思いましたが、失敗します。私は困惑しています。

4

2 に答える 2

3

_itoa_s()1つの文字と終了文字を書き出す必要がありますNUL。長さ=1のバッファに書き込む必要があります。したがって、初期化されていないために破損エラーが発生するか、ch_digit_s _itoa_s()(セキュア)ではなく、その1文字の後ろに書き込むことでスタックを破壊します。

しかし、この移植性のないMS固有の材木を使用する代わりに、10進数のASCII文字を「手動で」計算してみませんか?

for (int digit = 0; digit < 10; digit++)
{
    char ch_digit = '0' + digit; //'0' == 48 == 0x30
}
于 2013-02-03T14:06:51.650 に答える
2

itoa_*stringを書き込むため、null ターミネータが含まれます。

于 2013-02-03T14:20:11.210 に答える