我正在尝试_itoa_s
使用 MSVC2012 将数字的 0 到 9 转换为 ASCII,我发现自己遇到了堆栈损坏错误。
我以为 ASCII 表每个字符只占用一个字节,但从外观上看,一个字节是不够的。
我的想法哪里错了?
for (int digit = 0; digit < 10; digit++)
{
char ch_digit;
_itoa_s(digit, &ch_digit, 1, 10);
}
我认为这个简单的循环应该成功,但它失败了。我很困惑。
_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
}
itoa_*
写入一个string,因此涉及一个空终止符。