• 締切済み

構造体の後半をクリアするには?

メンバーが100ぐらいある構造体で後半の50のメンバーだけ 0クリアしたいのですが、1メンバーづつ0クリアしないと いけないのでしょうか? メンバーの型はいろいろです。 では、よろしくお願いします。

みんなの回答

回答No.7

「後半の50のメンバーだけ0クリア」って事は「前半と後半で、構造体を別々にするべき」なので、下手な小細工などせず、構造体を変更するのが筋です。 現在の構造体 struct ほげほげ { メンバー1 メンバー2 メンバー3  | メンバー49 メンバー50 メンバー51  | メンバー100 } hogehoge; を struct ほげほげ { struct ほげほげ前 { メンバー1 メンバー2 メンバー3  | メンバー49 } mae; struct ほげほげ後 { メンバー50 メンバー51  | メンバー100 } ushiro; } hogehoge; に書き換え、ushiroメンバを memset(&hogehoge.ushiro,0,sizeof(ushiro)); などで0クリアしましょう。

  • YEND77
  • ベストアンサー率56% (21/37)
回答No.6

(本回答でないので、ご参考に。。。) 0クリアしない方法で、論理削除フラグみたいなものを設け そのフラグだけの変更するようにすれば、管理が簡単かと思います。 (構造体のメンバでもいいし、管理領域を外出してもいい) またデータは必ず始めから詰められて格納されている前提ならば 最終ポイントの変数1個だけで管理可能です。

  • ricardo_
  • ベストアンサー率19% (14/72)
回答No.5

 後半50の先頭アドレスと構造体最後のアドレスが分かれば、出来るのではないでしょうか。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.4

言語仕様上動作は保証されないでしょうが、今どきの多くの環境で動くと思われる方法として下記のようなものが考えられます。 x = sizeof(構造体); y = offsetof(構造体, 0クリアしたい先頭メンバー); memset((構造体の先頭アドレス+y), 0, (x-y));

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.3

ごめんなさい 誤記があります ・0クリアしてほしくないメンバが0クリアされてしまった ・0クリアしてほしいメンバが0クリアされてしまった ===> ・0クリアしてほしくないメンバが0クリアされてしまった ・0クリアしてほしいメンバが0クリアされていない の間違いでした。

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

1メンバずつクリアするのが一番確実で分かり易いと思います。 他には 作業用の構造体(wk)を用意し memset若しくはZeroMemoryでwk全体を0で埋めた後 memmoveでwkに元の構造体の前半をコピーする コピーし終わったwkを元の構造体に代入し直す という手もあります。 この方法の難点は 構造体のメモリイメージをきっちり把握しておく必要がある点です。 最近のコンパイラは、アクセス速度を高速化するため メンバの間に隙間を空けたりする場合があります。 例えば、典型的な32ビットコンパイラでは struct {   char c[2];   int n; }; は、何バイトしょうか? sizeof (char) * 2 + sizeof (int) = 1* 2 + 4 = 6 ではありません。 32ビット境界に配置することで効率が良くなるので cとnの間に無駄な2バイトを挿入して8バイトにしてしまいます。 コンパイラ・オプション等で変更できる場合も多いので 常に8バイトとは限りません。 このように、正確にメモリ上のイメージをつかんでおかないと ・0クリアしてほしくないメンバが0クリアされてしまった ・0クリアしてほしいメンバが0クリアされてしまった ・わけわかんない値のメンバができてしまった   (メンバの途中から0クリアされてしまった為) などの事故が起きがちです 全く自信がないなら メンバごとにクリアするのがお勧めです 関数化すると良いでしょう。 自身はあまりないけれども メンバごとにクリアするのもいやだという場合は (VC++の場合) 構造体に #pragma pack 1 を適用しましょう (詳細はご自身で調査してください) 無駄な詰め物をしなくなります 先ほどの構造体はきっちり6バイトになります。 落とし穴にはまることがなくなります

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

考えましたが1メンバーづつ0クリアしないとだめだと思います 0にするメンバだけを別の構造体にするとかはだめですかね

関連するQ&A

専門家に質問してみよう