重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

VS2008 C++で文字セットはUnicode文字セットを使用しています

TCHAR bur[50];
_stprintf_s(buf, 50, _T("T = %d"), 100);

を実行すると「T=100」の後にNULLがきて、ここまでは正常ですが、残りの部分には0xfefeが文字列バッファの最後までコピーされます。
正常な動作なのでしょうか。

A 回答 (3件)

>文字列を初めNULLで埋めておき、必要なセクション情報を何個か追加するため _stprintf_s を使用しましたが、これを実行した直後にNULLが変ってしまいます。



NULLではない…というのは突っ込んだ後なのでいいとして……
VC++2008EEで下記のようにして確認してみました。

int _tmain(int argc, _TCHAR* argv[])
{
 TCHAR buf[50] = {0};

 _stprintf_s(buf, 50, _T("T = %d"), 100);
 return 0;
}

_stprintf_s()の行にブレークポイントを置いて、DebugビルドとReleaseビルドでステップオーバーしてみました。
Debugビルドだと確かに0xfefeで埋められてしまいますね。
ライブラリ側でそういう動作をするように作られているのでしょう。
# おそらく…第2引数に指定したサイズが誤っていないか、領域を埋めるコトで
# バッファーオーバーランチェック用の領域まで書き換えていないか確認する為……なのでしょう。
ちなみに、デバッグ版のランタイムが未初期化のローカル変数に突っ込むのは0xccでした。


ライブラリ側の仕様っぽいので、
>目的は「WritePrivateProfileSection」を使用していまして、この関数は最後はNULLを2つにしておく必要がある
文字列長を取得して、'\0'の後にさらに'\0'を書き込む。
という処理を追加しておいた方がいいでしょう。
    • good
    • 0

デバッグ版だとローカル変数とかの初期値として特定の値を設定するようにランタイム側で処理してくれていたりしますけど……。



>実行すると「T=100」の後にNULLがきて

NULLではなく'\0'かと。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2012/06/15 11:15

> 残りの部分には0xfefeが文字列バッファの最後までコピーされます。



このことをどうやって確認しましたか?
最初っから入ってたんじゃなくて?

この回答への補足

回答ありがとうございます。
目的は「WritePrivateProfileSection」を使用していまして、この関数は最後はNULLを2つにしておく必要があるため、文字列を初めNULLで埋めておき、必要なセクション情報を何個か追加するため _stprintf_s を使用しましたが、これを実行した直後にNULLが変ってしまいます。
確認は「ウオッチ」ウィンドウです。

補足日時:2012/06/15 11:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!