C言語関係掲示板

過去ログ

No.1081 char型配列の初期化

[戻る] [ホームページ]
No.14187

初期化について
投稿者---いなほ(2004/05/23 23:20:44)


配列の初期化について疑問に思うことがあります。
char a[5][5];
ループで
a[i][j]=NULL または、
a[i][j]=' ' または、
a[i][j]=0とすればよいのかわかりません。
一般的にはどのように初期化すればよいのでしょうか?
よろしくお願い致します。


No.14188

Re:初期化について
投稿者---RiSK(2004/05/24 00:23:09)


>配列の初期化について疑問に思うことがあります。
>char a[5][5];
>ループで
>a[i][j]=NULL または、
>a[i][j]=' ' または、
>a[i][j]=0とすればよいのかわかりません。
>一般的にはどのように初期化すればよいのでしょうか?

'\0' を使う。

NULL は空ポインタ。
' ' はスペース(文字)。 ただし、文字列の終端 '\0' が無いので危険
0 は '\0' と同じです。

私なら for を使わず
  char a[5][5] = {'\0'};
で一発です。

ってか for を使ったのは初期化ではなく単なる代入です。
# 結構これも初期化って呼ばれているようですが…



No.14192

Re:初期化について
投稿者---nop(2004/05/24 08:53:51)


>配列の初期化について疑問に思うことがあります。
>一般的にはどのように初期化すればよいのでしょうか?


まず、初期化と言うのは、そのプログラムで必要な初期値を設定することです。
char の配列の場合、大抵は空の文字列が多いため

>a[i][j]=0

あるいは

 a[i][j]='\0'

のどちらかが多いでしょうが、
実際には、「そのプログラムでどんな初期値が必要か?」と言うことに依存します。



No.14195

Re:初期化について
投稿者---NykR(2004/05/24 17:47:13)


> a[i][j]=NULL

NULLは空ポインタ定数に置換されます。さらに、空ポインタに変換されるかもしれません。
そうなるとポインタ型以外のオブジェクトに代入することはできません。
また、本来の意味とかけ離れた使い方をしているので、可読性の問題もあります。
だから、このような書き方はしてはいけません。


> a[i][j]=' ' または、
> a[i][j]=0

文字を設定するのなら、整数定数を使うより文字定数を使う方が自然だと思います。
例えばa[i][j]にスペースを入れたい場合、

a[i][j]=32 // (アスキーコードを使っているとして)

とするより、

a[i][j]=' '

とした方がわかりやすいです。
そうではなくて、整数値を設定したいときは整数定数の方がよいでしょう。

どのように書くべきかはあなたが何をやりたいかによります。
もしかするとループよりmemset()を使う方がいいかもしれません。
また、初期化子を使って初期化した方がよい場合もあります。
ですから、「どのようにすればよいか」についての一般的な答えはありません。


No.14212

Re:初期化について
投稿者---RAPT(2004/05/25 00:22:18)


σ(^^)の場合、初期化であれば、
char a[5][5] = {0};
で終了です。これですべての領域を 0 で埋められます。

また代入時に「0」と即値指定すると、セットする先がポインタの場合
自動的にNULLポインタとして扱われます。
FILE *fp = NULL; と
FILE *fp = 0; は同じことです。
が、ポインタである場合は明確に NULL とした方が分かりやすいです。

ただし、上記の方法では、その変数の方が数値型だった場合、その値が
0で初期化されることは保証されないので注意が必要です。

数値型の場合、すべてのビットを0で埋めたからといって必ずしも
数値の「0」となるとは限らないからです。
# 逆ですね。数値の「0」を表現するのにすべてのビットが「0」のとき
# とされるとは限らない、ですね。。




No.14213

Re:初期化について
投稿者---YuO(2004/05/25 00:35:29)


σ(^^)の場合、初期化であれば、
char a[5][5] = {0};
で終了です。これですべての領域を 0 で埋められます。


0で初期化する場合は私も同じです。
というか,「初期化」と言うからには初期化子を使った物のみですが。

ただし、上記の方法では、その変数の方が数値型だった場合、その値が
0で初期化されることは保証されないので注意が必要です。


「上記の方法」というのは,初期化子を使う方法でよいのでしょうか。
そうであれば,0で初期化を行った場合
  • 整数型は0
  • 浮動小数点数型は0.0
  • ポインタ型はヌルポインタ
に初期化されることが定められています。
memsetやcallocなどでは,浮動小数点数型やポインタ型は,
0.0やヌルポインタになることは保証されませんが……。

数値型の場合、すべてのビットを0で埋めたからといって必ずしも
数値の「0」となるとは限らないからです。


全ビット0の整数型は常に値0を持ちます。



No.14217

Re:初期化について
投稿者---円零(2004/05/25 09:58:35)


えと、これって、配列の初期化の時に全ての要素について値を指定しなかった場合、
残りの要素についてはゼロが設定されることに決まっていると言う話ですよね?

ちょっと言い足すだけでも割と親切度(いなほさんに対しての)が上がると思うので一言。


No.14238

Re:初期化について
投稿者---RAPT(2004/05/25 22:50:56)


YuOさん>
フォローありがとうございます。
memsetやcallocなどでは,浮動小数点数型やポインタ型は,
0.0やヌルポインタになることは保証されませんが……。
このことでした。ちょっと勘違いをしていました。