- ベストアンサー
NULLで初期化
C言語で char name[256]; のnameをNULLで初期化する場合どういう記述になりますか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
for(int i=0;i<256;i++) name[i]=NULL; または、 memclr(またはmemset) を利用。
その他の回答 (3)
- notnot
- ベストアンサー率47% (4900/10358)
#2の方も書いていますが、NULLというのはポインタ用の定数なので、char 型の変数に代入してはいけません。 コンパイラによっては、#define NULL 0 と定義されているため、たまたまエラーにならないケースも多いですが、間違いには違いありません。 #define NULL ((void *)0) と定義されている場合もあり、その場合はコンパイル時にエラーが出るはずです。 文字のヌルは普通 NUL と書きます。標準では定義されていない記号名なので Cで書くときは、0 または '\0' です。 #define NUL '\0' #defile TAB '\t' #define NL '\n' 等と自分で文字定数名を定義してそれを使ってもいいですけど、直接 '\x' の形式を使うのが普通だと思います。 初期化のやり方はどの方の回答でもいいですが、#1,#3の方の回答を使う時は、NULL を '\0' に訂正する必要があります。 エラーにならなければいいじゃないかと思われるかもしれませんが、'\n' が多く環境で 10 だからと言って、1から10までの合計を求めるのに、int s,i; s=NULL; for(i=!NULL;i<='\n';++i) s+=i; と書くのがおかしいのと同じレベルの間違いです。
ちなみにですね。 タイプが char 型の配列ですので、ただ純粋に文字列として使うのであれば、"name[0] = NULL;" もしくは "name[0] = '\0';" と記述してやればOKです。 この NULL のことを「ヌルターミネーター」と呼ぶのは……ご存知ですよね?(^_^; ( NULL と '\0' のどっちを使うかは、コンパイラの種類に寄ります。前者のほうが概念的に分かりやすくて個人的には好きなんですが、C++コンパイラでないと使えないことがあるようです。意味はどっちも全く同じです) しかし、char 型の配列を、文字列としてではなく、バイトアレイ(つまりバイナリ型データ)として使うのであれば、ヌルターミネーターを入れるだけでは駄目で、全部のメモリをヌルでクリアしてやる必要があります。 そんなときは "memset( name, NULL, sizeof(name) );" などと記述してやらなければいけません。 どっちを使うかは、そのときそのときの用法次第ですので、ここでは答えられません。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
char配列なので、NULLで初期化ではなく、'\0'で初期化でしょう。 #1の方の回答の他、宣言時に char name[256] = {'\0'}; でも。