2

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

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

我的想法哪里错了?

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

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

4

2 回答 2

3

_itoa_s()应该写出一个字符和终止NUL字符。您希望它写入长度 = 1 的缓冲区。因此,您可能会因为 uninitialized 而收到损坏错误ch_digit,或者_itoa_s()不是 _s (安全)并通过在那个字符后面写入来粉碎您的堆栈。

但是为什么不直接“手动”计算以 10 为底的 ASCII 字符,而不是使用这种不可移植的 MS 特定木材呢?

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

itoa_*写入一个string,因此涉及一个空终止符。

于 2013-02-03T14:20:11.210 回答