スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net (467レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
328(3): 2018/02/16(金)01:33 ID:Ja2iVc8/(1/3) AAS
構造体の、一部のみゼロ埋めする方法を知りたいです
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が出てしまいます
解決法を教えていただけますか
334: 2018/02/16(金)20:28 ID:Ja2iVc8/(2/3) AAS
328です
皆様情報ありがとうございました
構造体先頭から末尾までのmemsetとは事情が違うということが分かりました
offsetof()やダミーの構造体など、方針を見直します
ありがとうございました
340(1): 2018/02/16(金)23:47 ID:Ja2iVc8/(3/3) AAS
>>335
アライメントについては、OS、アプリ共に32ビットであり、
メンバも32ビットに揃える(パディングはさせない)ように
考慮されてはいるので、無効にしてみましたが変化はなさそうです
__attribute__ ((packed))付与有無でsizeof(aaa)としてみましたが、
どちらも4バイト×メンバ数となり、やぱりパディングは
されていないのかなと
>>336
構造体は、パディングに関わらず先頭以外の場所へmemsetやmemcpyで
触ってはならないのだろう、という思いに至り、方針を見直そうと思ったのですが
実際、書くとしたらどう書くことになるのでしょう
例えば、a〜zまで並べられているメンバ中、cからyまでゼロで埋める…みたいなので…
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.015s