解決済みの質問

memset の第2引数の型

void *memset( void *dest, int c, size_t count );

1文字の扱いはエラーを受け取るために char ではなく
int が使われていることが多いようです。
一般的には1文字の扱いは int であるという習慣が
memset に int が適用されている理由である
と考えられますが、その他に memset に int が使われて
いる大きなメリットは何かあるのでしょうか?

char str1[] = "abcdefghi";
memset( str1, (int)0x41424344, 3 );
//DDDdefghi

int i1[] = { 1, 2, 3, 4, 5 };
memset( i1, (int)0x10204080, 3 );
//0 800000 8000 80, 808080 2 3

投稿日時 - 2003-10-06 23:57:46

連想キーワード:

QNo.673215

A__

暇なときに回答ください

質問者が選んだベストアンサー

何かへの便宜というよりは、昔の習慣そのままだと思います。

ANSI-C以前では、関数側の引数定義を行っても、実際に引数を渡す際には
shortやcharはintに自動変換して渡していた(スタックに積んでいた)と思います。

つまり、charを定義していても
渡す側の変数char->intにしてスタック->関数側の変数になります。
そのため、shortやcharを引数にする関数は「無駄?」なのかintで
定義しているのかと思います。
同様にfloatもdoubleに変換されていたはずですから、floatを引数にする関数も無かったかと。

ちょっと、理屈としては弱いですが、こんな感じかと思います。

投稿日時 - 2003-10-07 12:19:56

お礼

ありがとうございました。

投稿日時 - 2003-10-15 00:51:00

ANo.2

0人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(1件中 1~1件目)

ANo.1

0x80~0xffの文字は、singed char の範囲(128~155)で表現する場合と unsigned char の範囲(-128~-1)で表現する場合があり、memset()などの引数ではどちらの範囲の値もカバーするintで受けておき、内部でsigned charにcastするようにすれば、どちらの場合も問題なく処理できるから、、、ではないでしょうか?

投稿日時 - 2003-10-07 01:29:47

お礼

ありがとうございました。

投稿日時 - 2003-10-15 00:51:21

あわせてチェックしたい
  • memsetについて ...
  • memsetについて ...
  • int ...
PR

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら