構造体配列の初期化

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ニトロ

構造体配列の初期化

#1

投稿記事 by ニトロ » 15年前

構造体配列の初期化は下のmemsetで正しいのでしょうか?
全て0埋めしたいです。
zeromemoryはつかわないものとします。
typedef struct{
    int a;
    int b;
}TEST;

TEST test[10];

memset( &test, 0, sizeof(test) );
memset( &test, 0, sizeof(test)*10 );

へろりくしょん

Re:構造体配列の初期化

#2

投稿記事 by へろりくしょん » 15年前

これでいいと思いますよ。

ただ、構造体のメンバに実数型・ポインタ型が含まれている場合、不都合が生じる事もありますね。
これはmenset()固有の問題ではなく、すべてのビットを0でクリアするという仕様上の問題です。

シエル

Re:構造体配列の初期化

#3

投稿記事 by シエル » 15年前

あれ?配列だから、&testの&はいらないんじゃ?

シエル

Re:構造体配列の初期化

#4

投稿記事 by シエル » 15年前

memset( &test, 0, sizeof(test)*10 );

↑あとこれは10倍する必要ってありましたっけ?

へろりくしょん

Re:構造体配列の初期化

#5

投稿記事 by へろりくしょん » 15年前

>あれ?配列だから、&testの&はいらないんじゃ?

あら。 そうですね。
思いっきり見逃していたようです。 失礼しました。


正解は、memset( test, 0, sizeof(test) );ですね。


memset( &test, 0, sizeof(test)*10 );
の場合は、test の型はTEST[10]ですので、*10はちょっとよろしくありませんね。
&も不要です。

バグ

Re:構造体配列の初期化

#6

投稿記事 by バグ » 15年前

memset(test, 0, sizeof(TEST)*10);

こうしたかったのではないかと推測

ニトロ

Re:構造体配列の初期化

#7

投稿記事 by ニトロ » 15年前

すみません(汗)
疑問に思って調べてみたのですが出てこなかったので
こちらにベタ書きして間違えておりました。
作っているソースでは&はついておりません。

>>正解は、memset( test, 0, sizeof(test) );ですね。
配列だからといって10倍しなくていいのですね。
勉強になりました。

みなさまご回答ありがとうございました。

>>バグ様
当たりですw
それも正しいのでしょうか?

シエル

Re:構造体配列の初期化

#8

投稿記事 by シエル » 15年前

正しいです。

フリオ

Re:構造体配列の初期化

#9

投稿記事 by フリオ » 15年前

 
 初期化なら、

TEST test[10] = {0};

でいいのではないでしょうか。

へろりくしょん

Re:構造体配列の初期化

#10

投稿記事 by へろりくしょん » 15年前

>TEST test[10] = {0};
>でいいのではないでしょうか。

そもそものスレッドの趣旨は
>全て0埋めしたいです。
ということですから、フリオさんの方法だとパティングの部分が0クリアされませんね。


追記です。

なんて書いておいて何ですが、パディングの中身を意識しなければならないようなコードは書くべきではありません。
アラインは処理系が都合上行うもので、プログラマが関知するべきではありません。
プログラマが扱うのはあくまでもメンバであるべきです。

画像

たかぎ

Re:構造体配列の初期化

#11

投稿記事 by たかぎ » 15年前

CとC++では事情が異なりますね。
Cだと、初期化以外ではmemsetもやむを得ないでしょうが、C++だと、

std::fill_n(test, 10, TEST());

のほうがよい気がします。

めるぽん

Re:構造体配列の初期化

#12

投稿記事 by めるぽん » 15年前

>ということですから、フリオさんの方法だとパティングの部分が0クリアされませんね。
初期化子を使って初期化した場合、指定していない領域が 0 で初期化されることは保証されています

たかぎ

Re:構造体配列の初期化

#13

投稿記事 by たかぎ » 15年前

> 初期化子を使って初期化した場合、指定していない領域が 0 で初期化されることは保証されています

確実に初期化されるのは、部分オブジェクトだけですね。
詰め物は部分オブジェクトではないのでは?
C++の場合は、もっとはっきりと、「明示的に初期化されなかった各メンバ」と書かれていますね(8.5.1 集成体)。

へろりくしょん

Re:構造体配列の初期化

#14

投稿記事 by へろりくしょん » 15年前

>初期化子を使って初期化した場合、指定していない領域が 0 で初期化されることは保証されています

最近の規格は知りませんが、本当にそうですか?

構造体の初期化子に省略されたメンバがある場合、それらのメンバは0で初期化されることが保証されていますが、構造体のすべてのビットが0で初期化される保証は無いと思うのですが。

めるぽん

Re:構造体配列の初期化

#15

投稿記事 by めるぽん » 15年前

ああ、ちゃんとパディング領域って書いてましたね、すみません。確かに構造体に対する初期化子だと無理そうです。
0埋めするのと全てのメンバを0初期化するのを混同してました。

閉鎖

“C言語何でも質問掲示板” へ戻る