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