關於A2W字元轉換巨集

2021-04-19 20:56:33 字數 1186 閱讀 6646

在乙個函式的迴圈體中使用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 theprogram

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 convert...

轉 A2W W2A T2A T2W 等巨集

如果你覺得使用 widechartomultibyte,multibytetowidechar 等函式比較麻煩 眾多的引數,緩衝區的分配與銷毀等。那麼可以使用 a2w w2a t2a t2w 等巨集來代替,它們對上面兩個函式進行了封裝。在使用這些巨集之前,應該包含標頭檔案 atlconv.h 並在呼...

ANSI與Unicode字元巨集轉換

ansi 操作函式以 str開頭,如 strcpy strcat strlen unicode 操作函式以 wcs開頭,如 wcscpy wcscpy wcslen ansi unicode 操作函式以 tcs 開頭 tcscpy c執行期庫 ansi unicode 操作函式以 lstr 開頭ls...