ページ 11

strcpyについて

Posted: 2009年2月25日(水) 00:19
by AC
毎度お世話になってます。
初心に帰って標準入出力をやってて引っかかったところを質問させていただきます。

とりあえずソースです。
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>

int _tmain(int argc, TCHAR* argv[/url], TCHAR* envp[/url])
{
	TCHAR* str;
	str = (TCHAR*)malloc(sizeof(TCHAR));
	if(!str) exit(EXIT_FAILURE);
	
	//_tcscpy_s(str, sizeof(str)/sizeof(str[0]), _T(""));
	// ↑だと、free()時に挙動がおかしくなる
	str[0] = '\0';
	_tprintf(_T("str = %s\n"), str);
	
	free(str);
	return 0;
}
コメントで書いた通りですが、_tcscpy_s(..., _T(""))だと、どうもfree()の時に、処理が止まってしまいます。
なぜダメなのでしょう?
ちなみに
str = (TCHAR*)malloc(sizeof(TCHAR) * 2);
	if(!str) exit(EXIT_FAILURE);
	
	_tcscpy_s(str, sizeof(str)/sizeof(str[0]), _T("x"));
	_tprintf(_T("str = %s\n"), str);
	
	free(str);
は大丈夫でした。_T("x")の場合はメモリ上に"x\0"が確保されて、それをstrにコピーするという手順を踏んでいると思うのですが、_T("")はメモリ上に'\0'が確保されるわけではないのでしょうか?

1.free()で処理が止まっているとき、いったい何をやっているのか(またはなぜプログラムが進まないのか)
2._T("")ではなぜだめなのか

の2点、ご教示のほどよろしくお願いします。

Re:strcpyについて

Posted: 2009年2月25日(水) 00:45
by 通りすがり
sizeof(str)/sizeof(str[0])はいくつになる?

strcpyについて

Posted: 2009年2月25日(水) 01:00
by AC
通りすがりさん回答ありがとうございます。

そういえばそうでした・・・。
x86でTCHAR = wchar_tだとすれば、

sizeof(str) / sizeof(str[0]) = sizeof(wchar_t*) / sizeof(wchar_t) = 4 / 2 = 2 ....

ですね…。やってしまった、という感じです。
_tcscpy_s(str, sizeof(str)/sizeof(str[0]), _T("x"));
がたまたま通ったのが、混乱のもとでした。
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>

int _tmain(int argc, TCHAR* argv[/url], TCHAR* envp[/url])
{
	TCHAR* str;
	str = (TCHAR*)malloc(sizeof(TCHAR));
	if(!str) exit(EXIT_FAILURE);
	_tcscpy_s(str, 1, _T(""));
	_tprintf(_T("str = %s\n"), str);

	free(str);
	return 0;
}
で正常に動作するのを確認いたしました。
これで解決とさせていただきます。あぁ空しい…orz。