No.1ベストアンサー
- 回答日時:
(1)memset(&lvitem, 0, sizeof(LVITEM));
この書き方は、構造体LVITEMを初期化しているんだな、と分かりやすい。
(2)memset(&lvitem, 0, sizeof(lvitem));
この書き方はとにかく変数lvitemを初期化するんだな、という感じだが、型が分からないので宣言しているところを参照しなければならない。
それともう一つ、ただ単に何回も初期化するんでなければ、こういう書き方もできる。
(3)LVITEM lvitem = {0};
結局どれがいいのかといえば、個人的にはケースバイケースですねえ。初期化を1回すればいいような感じなら(3)、構造体名を明示した方が調べる手間がなくなるようなら(1)、そうでなければ(2)を使います。
コンパイルでのメリット、デメリットは特にないんじゃないかなあ。アセンブラがまだ全盛だった頃ならともかく、いまじゃどのコンパイラだって最適化オプションで同じようなコードはくでしょう。
気にするほどでもないと思うけど…
No.4
- 回答日時:
1) memset(&lvitem, 0, sizeof(LVITEM));
2) memset(&lvitem, 0, sizeof(lvitem));
#1 の方の意見に近いですが、
自分がプログラムを書いているときは型と変数を意識していますから
あまり間違えないですが、
他人のプログラムを読むときは 2) のほうが読みやすい(親切)です。
少なくとも、memset() を使う際は lvitem の型はどうでもいいことなので、
「lvitem 全体をゼロクリアしてる」ということがすぐ分かりますから。
※「lvitem の型はホントに LVITEM?」とチェックしなくてよい。
ただし、lvitem がポインタだった場合、
2-a) memset(plvitem, 0, sizeof(*plvitem)); // OK
2-b) memset(plvitem, 0, sizeof(plvitem)); // バグ
のように「*」を忘れる可能性があります。
※ちなみに、sizeof() は関数ではなく演算子なので、
ポインタ plvitem がどんな値でも(NULL でもゴミでも)問題なしです。
実行時ではなく、コンパイル時に解決されるからです。
あと、配列の場合は 2) を使うのですが、
その配列変数が外部変数で extern 参照しているときは
上の 2-b) のパターンなのでバグになります。
extern LVITEM lvitem1[5];
LVITEM lvitem2[5];
memset(lvitem1, 0, sizeof(lvitem1)); // バグ
memset(lvitem2, 0, sizeof(lvitem2)); // OK
どちらも一長一短という感じですが、
個人的には 2) が好みです。
No.3
- 回答日時:
2つの例を
例1
char sz[5];
memset(sz, 0, sizeof(sz));
配列を初期化したいときは変数を指定しないとだめですよね。
例2
LVITEM * plvItem;
plvItem = malloc(sizeof(LVITEM));
memset(plvItem, 0, sizeof(LVITEM));
ポインタ変数の場合、変数のsizeofだとだめですよね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- ノートパソコン 初期化する方法を教えて欲しい。 2 2023/01/06 14:49
- 生物学 至急です カメレオンやカエルなど、体色変化の特徴を持つ動物の皮膚構造・構造式等がわかれば教えてくださ 1 2022/08/24 02:05
- Windows 10 パソコン初期化の件です 2 2022/06/05 11:05
- ラグビー・アメリカンフットボール アメリカンフットボール。 防具、平成初期と比べて 小ぶりになりましたよね? 肩。 材質とか構造が進化 2 2022/08/15 20:21
- ガラケー・PHS 22年前のガラケーの譲渡について 1 2022/07/03 22:27
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- 飛行機・空港 皆さん、こんにちは! 飛行機の機体について教えてください。 飛行機は、どのような構造でなぜ長時間飛行 3 2022/10/17 14:46
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- 化学 大学化学について質問です。専攻されている方、わかる方いる人いたら教えていただけると嬉しいです。 エチ 1 2022/05/10 11:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
init関数の意味
-
C言語でのconstを返す関数
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
コンストラクタでnewを失敗した...
-
Run-Time Check Failure #3とい...
-
ハンドル、アドレス、ポインタ...
-
C言語のポインタに直接アドレス...
-
LPSTR型の初期化について
-
VBはCを混乱させる?
-
ハンドルはポインタか
-
構造体の中の構造体
-
パスからファイル名を抽出
-
C言語でポインタを使ってピタ...
-
単方向リスト
-
AESのC言語による実装
-
ExcelVBAでのkernel32(64bit)
-
nullポインタを逆参照とは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
セグメントエラー
-
アプリを32bitから64bit移行
-
コンストラクタでnewを失敗した...
-
ExcelVBAでのkernel32(64bit)
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
DLL<->VB間での受け渡し(文字...
-
C言語でのconstを返す関数
-
ポインタについて
-
参照型で受け取った引数をポイ...
-
TCHAR文字列内の検索について
-
デバイスハンドルとは?
-
基本アルゴリズムの『返す』の...
おすすめ情報