2013-02-03 82 views
2

我想使用_itoa_s将数字的0到9转换为ASCII,我发现自己正在使用MSVC2012运行到堆栈损坏错误。这是_itoa_s失败的技术原因是什么?

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

我的思维错在哪里?

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

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

+2

空终止符? –

+0

空终结是我在C. Argghghh –

+1

存在的祸根@Oli使这一问题被接受和被遗忘的(和托尼需要一些睡眠或咖啡:-) –

回答

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

你忘了空终止符... –

+0

其实我编辑它。 NULL终止符会导致'_itoa_s()'不执行任何操作,ch_digit未初始化(固定)。 – Sam

+0

空终止符(或更好的终止符)是'NUL'字符(等于小数“0”)。没有“* ... NULL char *”。 'NULL'是一个指针值,完全不同。 – alk

2

itoa_*写入,所以有介入空终止符。