製作Direct2D的程序,我想轉換從int
到WCHAR
C++需要交代,所以我寫了下面的代碼上`靜態常量WCHAR *`
void DemoApp::OnRender() {
//...
int a = 256;
std::wstring wStr = std::to_wstring(a);
static const WCHAR* pStrNum = wStr.c_str();
//Print the number to the screen
_pRenderTarget->DrawText(
pStrNum,
sizeof(pStrNum)/sizeof(pStrNum[0]),
_pTextFormat,
rect,
_pBrush);
//...
};
然而,一個循環之後,pStrNum
改變的東西奇怪的是,起始字符是5028十進制的基數。
搞亂一點後,我改變了轉換代碼,以
const WCHAR* pStrNum = wStr.c_str();
的字符串幾乎正確地打印在屏幕上和一切似乎是除了具有2的值sizeof(pStrNum)/sizeof(pStrNum[0])
正常,因此只打印前兩個字符在屏幕上。畢竟,我必須使用lstrlenW()
來獲取該字符串中元素的數量。
我需要爲什麼static const WCHAR*
不同於const WCHAR*
並導致交代錯誤
爲什麼sizeof()
不會在這種情況下工作嗎?
我認爲這是未定義的一個不同的原因:它將被初始化爲保存一個指向在函數調用後死亡的局部變量的指針。由於它只被初始化一次,它爲下一次調用保留一個懸掛指針。 – juanchopanza
這(最初的答案)是完全錯誤的。 @juanchopanza對此有一個正確的分析:因爲該變量是靜態的,所以只有在第一次調用該函數時才進行初始化。 (如果這是他的確切代碼,那麼使'wStr'靜態也可以解決這個問題,但是,那麼他可能會寫'static wchar_t const pStrNum [] = L「256」;'並且完成它。) –
對了,我修改了。沒有注意到,該操作已經將代碼包裝在一個函數中。 – Bathsheba