謹慎使用A2W等字元轉換巨集

2021-06-18 11:16:03 字數 1121 閱讀 8402

在乙個函式的迴圈體中使用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 或者簡稱字串。由於一些符號有他們特殊的功能 因此當你想列印出它們本身時需要用反斜...