strcpyについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
AC

strcpyについて

#1

投稿記事 by AC » 16年前

毎度お世話になってます。
初心に帰って標準入出力をやってて引っかかったところを質問させていただきます。

とりあえずソースです。
#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について

#2

投稿記事 by 通りすがり » 16年前

sizeof(str)/sizeof(str[0])はいくつになる?

AC

strcpyについて

#3

投稿記事 by AC » 16年前

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

そういえばそうでした・・・。
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。

閉鎖

“C言語何でも質問掲示板” へ戻る