2011-09-12 96 views
2

我有以下代碼,但它會導致異常。沒有itoa「遊戲」我不認爲有問題。 TextOutA是因爲我使用winapi。新增和刪除char *導致異常

char* p1 = new char[2]; 
itoa(10,p1,10); 
TextOutA(hDC,5, currenty,p1,2); 
delete[] p1; 

回答

7

你的StringBuffer太短

itoa溢出緩衝區容量以書面空終止字符。

char* p1 = new char[3]; 
itoa(10,p1,10); 
TextOutA(hDC,5, currenty,p1,2); 
delete[] p1; 

我建議你製作足夠大的緩衝區以容納整個整數範圍。

編輯以防萬一,詳細闡述了字符串流建議:

#include <sstream> 

//.... 
{ 
    std::stringstream ss; 
    ss << 10; 
    std::string s = ss.str(); 
    TextOutA(hDC, 5, currenty, s.c_str(), s.length()); 
} 
+3

我建議使用'std :: ostringstream'和'std :: string',而不必擔心緩衝區的大小。 (在這種簡單的情況下,你可以使用'boost :: lexical_cast '。) –

+0

@James:那當然是 – sehe

+0

非常感謝你的快速響應!工作! – dusm

2

您還沒有分配足夠的空間來存儲「10」,因爲,像所有的C字符串,它需要N + 1個字符,其中N是字符串的長度。最後一個字符是空終止符。您應該分配3個字符(或更多)。或使用snprintf。或者std::stringstream

這裏有一些much better alternatives使用itoa,假設你不需要專門的基數格式(儘管其中一些也可以)。

0

您不爲字符串分配足夠的空間。

char* p1 = new char[2]; 
itoa(10,p1,10); 

p1是2個字節長,這是僅適用於1個字符的字符串足夠(另一個字符就是空終止子)。您應該保留足夠長的時間以保留任何可能的結果,對於32位系統和base = 10,結果將爲11。