_itoa_s失败的技术原因是什么?

时间:2013-02-03 13:52:27

标签: c ascii itoa

我正在尝试使用_itoa_s将数字0到9转换为ASCII,我发现自己在使用MSVC2012时遇到堆栈损坏错误。

我认为ASCII表每个字符只占用一个字节,但从外观来看,一个字节是不够的。

我的想法在哪里错了?

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

我认为这个简单的循环应该成功,但它失败了。我很困惑。

2 个答案:

答案 0 :(得分:3)

_itoa_s()应该写出一个字符和终止NUL字符。您希望它写入长度为1的缓冲区。因此,要么因未初始化ch_digit而导致损坏错误,要么_itoa_s()不是_s(安全),并通过写入后面的内容来刷新堆栈炭。

但为什么不只是手动计算基数为10'的ASCII字符而不是使用这种非便携式MS特定木材?

for (int digit = 0; digit < 10; digit++)
{
    char ch_digit = '0' + digit; //'0' == 48 == 0x30
}

答案 1 :(得分:2)

itoa_*写了一个字符串,因此涉及到一个空终结符。