構造体の初期化について

解決


匿名  2004-12-03 18:10:00  No: 55432

VC++を最近始めた者です。
かなり初心者発言で申し訳ないんですが、
構造体って初期化(NULL)出来るのでしょうか?

struct kouzoutai{
   char a[2];
   char b[3];
   char c[5];
}

上記のa〜cを空(ゴミを削除)にしたいんですが
どうすれば良いのでしょうか?

どなたか是非教えてください。
宜しくお願い致します。


Ban  2004-12-03 19:07:10  No: 55433

構造体にもコンストラクタがかけます。(C++の場合)

struct kouzoutai{
    char a[2];
    char b[3];
    char c[5];
    kouzoutai(){
        // ここで std::memset なりして初期化できる
    }
};


匿名  2004-12-03 19:15:31  No: 55434

Banさん有難うございます。
「ここで std::memset なりして初期化できる」
とはどういうことなんですか?
めちゃくちゃ初心者で申し訳ありません。


Ban  2004-12-03 19:31:50  No: 55435

a, b, c が"文字列"用途なら、

a[0] = '\0'; // 以下略

で十分かも知れません。

"文字の配列"なら、

std::memset(a, 0x00, sizeof a);  // 以下略

とか

for(register int n=0; n < sizeof a; ++n) a[n] = '\0';

とかすればよいと思います。
# VC のバージョンが不明ですが、古い VC は std:: を外さないとエラーになります。


匿名  2004-12-03 19:49:15  No: 55436

std:: を外して出来ました。
Banさん丁寧な説明有難うございました。


(noname)  2004-12-04 09:57:14  No: 55437

よう。解決したみてーだけど,ちょっといいか。
「初期化時に」ゼロでクリアしたいんだよな。
これは言語仕様で保証されてねかったか?

struct kouzoutai{
   char a[2];
   char b[3];
   char c[5];
};

int main () {
  kouzoutai not_cleared;
  kouzoutai cleared = {0}; // これだ

  FILE *fp = fopen( "out.dat", "wb" );

  if (fp) {
    fwrite( &not_cleared, sizeof(not_cleared), 1, fp );
    fwrite( &cleared, sizeof(cleared), 1, fp );
    fclose( fp );
    // できたファイルをバイナリエディタで見てみろw
  }
}

これを応用して

struct kouzoutai {
  /* ... */
} kouzoutai_0 = {0}; // kouzoutai のゼロオブジェクト

int main () {
  kouzoutai kz;

  /* kz をいろいろいじった後に */

  kz = kouzoutai_0;  // ゼロクリアできる
}

俺はこれをよく使うんだけどよ(´Д`)y-~~
まー,俺みてーなクソはよ,バグがあっても露見しなきゃいいとか
考えている野郎だから,ちょっとヤベーかもしれねーがw


RAPT  2004-12-06 07:05:02  No: 55438

> ={0};
これ、常用しています。結構知らない人多いらしいけど。

> kz = kouzoutai_0;  // ゼロクリアできる
構造体が代入できるようになってよかったと思う今日この頃。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加