スレを勃てるまでもないC/C++の質問はここで 25
[隔離病棟]
©2ch.net (467レス)
スレを勃てるまでもないC/C++の質問はここで 25
[隔離病棟]
©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1471100645/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
328: デフォルトの名無しさん [sage] 2018/02/16(金) 01:33:43.00 ID:Ja2iVc8/ 構造体の、一部のみゼロ埋めする方法を知りたいです CコンパイラはMingw-win32のgcc 6.3.0を使ってます struct aaa_tag{ uint32_t a; uint32_t b; uint32_t c; : uint32_t z; } という構造体に、fread(&aaa, sizeof(aaa), 1, fp)でファイルから値を読み込んでいるのですが 実は構造体としてファイルから読み込むべきサイズが条件により変える必要があります 例えば以下のようにです ・bが1の場合は有効なのはaとbのみ。c以降の値はゼロで書き戻す ・bが5の場合は有効なのはa〜wまで。x以降の値はゼロに書き戻す まずbを読んで、それから必要なサイズを読み出す…も考えたのですがそうではなく、 構造体の途中以降をゼロクリアしようと思っているのですが、これがうまくいきません if (b == 1)memset(&aaa + sizeof(uint32_t) * 2, 0x00, sizeof(aaa) - sizeof(uint32_t)); 等と試行錯誤しているのですが、SIGSEGVが出てしまいます 解決法を教えていただけますか http://mevius.5ch.net/test/read.cgi/tech/1471100645/328
331: デフォルトの名無しさん [sage] 2018/02/16(金) 06:26:26.41 ID:6scYlSnj >>328 セグメンテーションフォールトを起こす直接の原因は、 memset() の第1引数 &aaa + sizeof(uint32_t) * 2 の部分だろうね。 printf("%p\n", &aaa); printf("%p\n", &aaa.c); printf("%p\n", &aaa + sizeof(uint32_t) * 2); 上の3行の出力を比較検討すると理屈が分かると思うけど説明は長くなる。 というか、俺にはポインタ加算について短く平易に説明する能力がない。 #include <stddef.h> // offsetof()マクロの定義 if (b == 1)memset(&aaa.c, 0x00, sizeof(aaa) - offsetof(struct aaa_tag, c); で動くと思うけど、 ダミーの構造体に読み込んでから、bの値を見て有効な部分だけ (あらかじめ0クリアしておいた)返却用の構造体にコピー、とする方が素直かも。 http://mevius.5ch.net/test/read.cgi/tech/1471100645/331
333: デフォルトの名無しさん [sage] 2018/02/16(金) 20:12:13.91 ID:hi0D4ZsY >>328 構造体のアラインメントでぐぐれ http://mevius.5ch.net/test/read.cgi/tech/1471100645/333
338: デフォルトの名無しさん [sage] 2018/02/16(金) 22:59:31.13 ID:IhCFworu >>335 >>328のケースではアラインメントを無効化してもダメだろうよ http://mevius.5ch.net/test/read.cgi/tech/1471100645/338
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.039s