0

次のコード行を継承しました。

TCHAR temp[300];
GetModuleFileName(NULL, temp, 300);

ただし、最初の 3 バイトがガベージ値で満たされているため、これは失敗します (ただし、-128、-13、23 の順序で常に同じ値になります)。私は言った、まあいいと言って、それを次のように変更しました:

TCHAR temp[300];
ZeroMemory(temp, 300);
GetModuleFileName(NULL, temp, 300);

しかし、ガベージ値は持続しました! ZeroMemory() 呼び出しの後、他のすべてのバイトが適切に消去され、GetModuleFileName() の後、ディレクトリがバッファに適切に格納されたことに注意してください。temp が temp+3 に置き換えられたかのようです。これは単語の境界と関係がありますか?

誰かが何が起こっているのか、それを修正する方法を説明できますか?

4

1 に答える 1

1

ZeroMemoryバイト単位で機能しますが、300TCHARの配列があります。これにより、ワイドチャー (マルチバイトではない) コンパイル オプションを使用していると思われます。

以下を使用する必要があります。

ZeroMemory(temp, 300 * sizeof(TCHAR));

またはあなたの特定のケースでは:

ZeroMemory(temp, sizeof(temp));

ただし、後者には注意してください。temp宣言が関数内で見える自動配列である場合に適用されます。コンパイラにとって割り当てサイズが「見えない」ポインタの場合、ポインタsizeofのサイズだけが表示されます。

于 2010-05-20T19:16:46.983 に答える