2013-02-03 80 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_*寫入,所以有介入空終止符。