在乙個函式的迴圈體中使用a2w等字元轉換巨集可能引起棧溢位。
#include void fn()
}}讓我們來分析以上的轉換巨集
#define a2w(lpa) (\
((_lpa = lpa) == null) ? null : (\
_convert = (lstrlena(_lpa)+1),\
atla2whelper((lpwstr) alloca(_convert*2), _lpa, _convert)))
#define atla2whelper atla2whelper
inline lpwstr winapi atla2whelper(lpwstr lpw, lpcstr lpa, int nchars, uint acp)
關鍵的地方在 alloca 記憶體分配記憶體上。
#define alloca _alloca
_alloca
allocates memory on the stack.
remarks
_alloca allocates size bytes from the program stack. the allocated space is automatically freed when the calling function
exits. therefore, do not pass the pointer value returned by _alloca as an argument to free.
問題就在這裡,分配的記憶體是在函式的棧中分配的。而vc編譯器預設的棧記憶體空間是2m。當在乙個函式中迴圈呼叫它時就會不斷的分配棧中的記憶體。
以上問題的解決辦法:
1、自己寫字元轉換函式,不要偷懶
function that safely converts a 'wchar' string to 'lpstr':
char* convertlpwstrtolpstr (lpwstr lpwszstrin)
} return pszout;
}等等乙個乙個的實現。
2、把字元轉換部分放到乙個函式中處理。
void fn2()
void fn()
}
關於A2W字元轉換巨集
在乙個函式的迴圈體中使用a2w等字元轉換 巨集可能引起棧溢位。include void fn 讓我們來分析以上的轉換巨集 define a2w lpa lpa lpa null null convert lstrlena lpa 1 atla2whelper lpwstr alloca conver...
轉 A2W W2A T2A T2W 等巨集
如果你覺得使用 widechartomultibyte,multibytetowidechar 等函式比較麻煩 眾多的引數,緩衝區的分配與銷毀等。那麼可以使用 a2w w2a t2a t2w 等巨集來代替,它們對上面兩個函式進行了封裝。在使用這些巨集之前,應該包含標頭檔案 atlconv.h 並在呼...
2 注釋 常量 變數 轉移字元 等
2 注釋 常量 變數 轉移字元 等 標籤 空格分隔 未分類 注釋 可以注釋多行,但是不能巢狀注釋 可以巢狀 注釋單行 字串 hello word 這種由雙引號引起來的一串字元稱為字串字面值 string literal 或者簡稱字串。由於一些符號有他們特殊的功能 因此當你想列印出它們本身時需要用反斜...