開発環境 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