開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
Win32 コンソール アプリケーション |
プロジェクト名 |
test |
アプリケーションの種類 |
コンソール アプリケーション |
追加のオプション |
空のプロジェクト |
test1.c
#include <direct.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
char acDir[_MAX_DIR];
_getcwd(acDir, sizeof acDir);
printf("[%s]\n", acDir);
}
char型は1バイトなので問題ないが、正確には sizeof acDir / sizeof acDir[0] である
test2.c
#include <direct.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
wchar_t awcDir[_MAX_DIR];
_setmode(_fileno(stdout), _O_WTEXT);
_wgetcwd(awcDir, sizeof awcDir); // アクセス違反が発生
wprintf(L"[%s]\n", awcDir);
}
マルチバイト文字をワイド文字に修正し実行した所、アクセス違反が発生した
文字数を渡すべき所をバイト数で渡したためだ
test3.c
#include <direct.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
wchar_t awcDir[_MAX_DIR];
_setmode(_fileno(stdout), _O_WTEXT);
// _wgetcwd(awcDir, sizeof awcDir); // アクセス違反が発生
_wgetcwd(awcDir, _MAX_DIR); // バイト数ではなく文字数
// _wgetcwd(awcDir, sizeof awcDir / sizeof awcDir[0]);
wprintf(L"[%s]\n", awcDir);
}
文字数を渡すようにすると正常に動作した
test4.c
#include <direct.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
wchar_t awcDir[_MAX_DIR];
_setmode(_fileno(stdout), _O_WTEXT);
_wgetcwd(awcDir, _countof(awcDir));
wprintf(L"[%s]\n", awcDir);
}
結局、最初からsizeof演算子ではなく_countofマクロを使うのが一番良いのかもしれない
最終更新:2012年09月01日 16:51