ページ 11

構造体の初期化について

Posted: 2014年2月10日(月) 20:48
by atrix
私は最近、プログラムを見ていてふと疑問に思ったことがあるので、質問させていただきました。
構造体を初期化するときに、memsetを使うと思うのですが、ここで、例えば以下のような記述をとりあげてみると、
&をつける場合とつけない場合があるのです。
memset(&ch,0,sizeof(ch_t));
memset(shot,0,sizeof(shot_t)*SHOT_MAX)

この違いが何によるものか、教えていただきたいのです。
見た目の違いは、sizeof()の後に定数をかけているかどうか、くらいしか分かりませんでした。
もし、それによるものならば、どうしてなにでしょうか?
おねがいします。

Re: 構造体の初期化について

Posted: 2014年2月10日(月) 20:57
by softya(ソフト屋)
上は単なる構造体変数で、下は構造体の配列です。
配列の場合は、配列名は配列の先頭ポインタとみなすという仕組みが有るので&が必要ありません。
実は知らない間に使っていて、文字列(文字の配列)の時に無意識に&を書いていないと思いますよ。
char str[] = "test";
printf( "%s",str);
こんな感じで&を使いませんよね?

Re: 構造体の初期化について

Posted: 2014年2月10日(月) 21:04
by box
atrix さんが書きました: memset(&ch,0,sizeof(ch_t));
memset(shot,0,sizeof(shot_t)*SHOT_MAX)
たぶん、

コード:

    ch_t ch;
    shot_t shot[SHOT_MAX];
のように定義しているのでありましょう。

Re: 構造体の初期化について

Posted: 2014年2月11日(火) 18:51
by atrix
お二人とも、ありがとうございました。
boxさんのおっしゃっている通りの宣言で、ソフト屋さんがご指摘してくださった通り、文字列の配列では確かに無意識でそのように使用しておりました。適格なご説明、ありがとうございました。
とてもすっきりして、理解できました。