構造体の初期化について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
atrix
記事: 14
登録日時: 12年前

構造体の初期化について

#1

投稿記事 by atrix » 12年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 12年前

上は単なる構造体変数で、下は構造体の配列です。
配列の場合は、配列名は配列の先頭ポインタとみなすという仕組みが有るので&が必要ありません。
実は知らない間に使っていて、文字列(文字の配列)の時に無意識に&を書いていないと思いますよ。
char str[] = "test";
printf( "%s",str);
こんな感じで&を使いませんよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 15年前

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

#3

投稿記事 by box » 12年前

atrix さんが書きました: memset(&ch,0,sizeof(ch_t));
memset(shot,0,sizeof(shot_t)*SHOT_MAX)
たぶん、

コード:

    ch_t ch;
    shot_t shot[SHOT_MAX];
のように定義しているのでありましょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

atrix
記事: 14
登録日時: 12年前

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

#4

投稿記事 by atrix » 12年前

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

閉鎖

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