構造体の初期化について

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

構造体の初期化について

#1

投稿記事 by デンマーク » 17年前

質問があります。
C言語の構造体の初期化についてですが
最初は※1のようにすれば構造体のメンバが全部初期化
されると思っていましたが、data_set[SIZE]の配列は
SIZE分だけ初期化する必要があるそうなのですが
どうすればいいのかわかりません。
どなたかアドバイスお願いします。
環境はボーランドを使っています。

typedef struct {
  long data_set[SIZE];
long data_head;
long data_number;
long data_new;
long data_index;
long data_count;
long data_location ;
}DATA;

DATA data_data;//変数を使うために宣言 DATAは型でdata_dataは変数

void init(void)//初期化
{
DATA data_data = { 0,0,0,0,0,0 };※1 初期化
}

ibis

Re:構造体の初期化について

#2

投稿記事 by ibis » 17年前

{{0, 0,・・・}, 0, 0, ・・・}
みたいに。

box

Re:構造体の初期化について

#3

投稿記事 by box » 17年前

変数 data_data を、関数の外で定義したいのですか?
それとも、init 関数の中で自動変数として定義したいのですか?
どちらの方法を採りたいかによって、明示的な初期化が
必要かそうでないかの違いがあります。

デンマーク

Re:構造体の初期化について

#4

投稿記事 by デンマーク » 17年前

 すいません。。
 説明不足でした。
 変数 data_data を、関数の外で定義します。。
 
 そして{{0, 0,・・・}, 0, 0, ・・・} のようにも
 考えたのですがSIZEのところをfor文で回したいと考えています・・

box

Re:構造体の初期化について

#5

投稿記事 by box » 17年前

関数の外で定義するのであれば、明示的な初期化を行なわなくても
当該構造体の全メンバー(配列かどうかは無関係)をゼロで初期化します。

フリオ

Re:構造体の初期化について

#6

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

> void init(void)//初期化
> {
> DATA data_data = { 0,0,0,0,0,0 };※1 初期化
> }

 この場合だと、全てのメンバを 0 で初期化するなら、

DATA data_data = {0};

でいいです。
 

ななしさん

Re:構造体の初期化について

#7

投稿記事 by ななしさん » 17年前

一般的に構造体をとにかく0で初期化したいときは
ZeroMemory(data,sizeof(data))を使います
これがエラーを吐くようならmemset(data,0,sizeof(data))を利用してください

box

Re:構造体の初期化について

#8

投稿記事 by box » 17年前

ZeroMemory は Win32API に属しているんですよね?
ということは、環境によって使えない場合がありますので、
一般的とはいえないと思います。

一方、memset は C言語の標準関数です。
おそらくすべての Cコンパイラーで使えるはずです。

したがって、どちらが一般的かといえば、memset の方です。

たかぎ

Re:構造体の初期化について

#9

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

構造体のメンバがすべて整数型であれば実質的な問題はありませんが、ZeroMemoryであろうがmemsetであろうが、そのような方法でゼロクリアするのは一般的とはいえません。
http://www.kijineko.co.jp/tech/supersti ... emset.html

一般的には、

DATA data_data = {0};

が正解です。

デンマーク

Re:構造体の初期化について

#10

投稿記事 by デンマーク » 17年前

 なるほど!!
 ありがとうございます。
 
 DATA data_data = {0}; でOKのようですね。
 またなにかあったら宜しくお願いします

閉鎖

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