wcsncpy_s関数がどのように機能し、バッファオーバーフローを防ぐ方法を理解しようとしています。まず、MSDNによると、この関数の引数は次のことを意味します。
strDest=宛先文字列。
numberOfElements=宛先文字列のサイズ。
strSource=ソース文字列。
count =コピーする文字数、または_TRUNCATE。
ここで、このコードについて考えてみましょう。
wchar_t a[5];
wcsncpy_s(a, 10, L"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 9);
printf("%d\r\n", sizeof(a));//10
printf("%d\r\n", wcslen(a));//9
wprintf(L"%s", a);//ABCDEFGHI
これらすべてを理解すると、最大4つのワイド文字とヌルターミネータを保持することになっている「a」は、現在9つのワイド文字を保持します。
次のコードにより、デバッグアサーション(VS 2005コンパイラ)が失敗したためにアプリが突然終了します。
wchar_t a[5];
wcsncpy_s(a, 10, L"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10);
printf("%d\r\n", sizeof(a));
printf("%d\r\n", wcslen(a));
wprintf(L"%s", a);
誰かが上記のコードと、wcsncpy_sがバッファオーバーフローを防ぐためにどのように想定されているかを説明できますか?