私は最近、プログラムを見ていてふと疑問に思ったことがあるので、質問させていただきました。
構造体を初期化するときに、memsetを使うと思うのですが、ここで、例えば以下のような記述をとりあげてみると、
&をつける場合とつけない場合があるのです。
memset(&ch,0,sizeof(ch_t));
memset(shot,0,sizeof(shot_t)*SHOT_MAX)
この違いが何によるものか、教えていただきたいのです。
見た目の違いは、sizeof()の後に定数をかけているかどうか、くらいしか分かりませんでした。
もし、それによるものならば、どうしてなにでしょうか?
おねがいします。
構造体の初期化について
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 構造体の初期化について
上は単なる構造体変数で、下は構造体の配列です。
配列の場合は、配列名は配列の先頭ポインタとみなすという仕組みが有るので&が必要ありません。
実は知らない間に使っていて、文字列(文字の配列)の時に無意識に&を書いていないと思いますよ。
char str[] = "test";
printf( "%s",str);
こんな感じで&を使いませんよね?
配列の場合は、配列名は配列の先頭ポインタとみなすという仕組みが有るので&が必要ありません。
実は知らない間に使っていて、文字列(文字の配列)の時に無意識に&を書いていないと思いますよ。
char str[] = "test";
printf( "%s",str);
こんな感じで&を使いませんよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 構造体の初期化について
たぶん、atrix さんが書きました: memset(&ch,0,sizeof(ch_t));
memset(shot,0,sizeof(shot_t)*SHOT_MAX)
のように定義しているのでありましょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 構造体の初期化について
お二人とも、ありがとうございました。
boxさんのおっしゃっている通りの宣言で、ソフト屋さんがご指摘してくださった通り、文字列の配列では確かに無意識でそのように使用しておりました。適格なご説明、ありがとうございました。
とてもすっきりして、理解できました。
boxさんのおっしゃっている通りの宣言で、ソフト屋さんがご指摘してくださった通り、文字列の配列では確かに無意識でそのように使用しておりました。適格なご説明、ありがとうございました。
とてもすっきりして、理解できました。