• ベストアンサー

NULLで初期化

C言語で char name[256]; のnameをNULLで初期化する場合どういう記述になりますか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

for(int i=0;i<256;i++) name[i]=NULL; または、 memclr(またはmemset) を利用。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4855/10270)
回答No.4

#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; と書くのがおかしいのと同じレベルの間違いです。

全文を見る
すると、全ての回答が全文表示されます。
noname#25358
noname#25358
回答No.3

 ちなみにですね。  タイプが char 型の配列ですので、ただ純粋に文字列として使うのであれば、"name[0] = NULL;" もしくは "name[0] = '\0';" と記述してやればOKです。  この NULL のことを「ヌルターミネーター」と呼ぶのは……ご存知ですよね?(^_^; ( NULL と '\0' のどっちを使うかは、コンパイラの種類に寄ります。前者のほうが概念的に分かりやすくて個人的には好きなんですが、C++コンパイラでないと使えないことがあるようです。意味はどっちも全く同じです)  しかし、char 型の配列を、文字列としてではなく、バイトアレイ(つまりバイナリ型データ)として使うのであれば、ヌルターミネーターを入れるだけでは駄目で、全部のメモリをヌルでクリアしてやる必要があります。  そんなときは "memset( name, NULL, sizeof(name) );" などと記述してやらなければいけません。  どっちを使うかは、そのときそのときの用法次第ですので、ここでは答えられません。

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

char配列なので、NULLで初期化ではなく、'\0'で初期化でしょう。 #1の方の回答の他、宣言時に char name[256] = {'\0'}; でも。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 配列のNULL初期化について

    C言語についての課題の一部です。 int型の配列 iArrayをNULL初期化したいのですが、 課題では下のように書かれています。 &iArray[] = NULL; このような書き方でNULL初期化することは可能なのでしょうか?

  • NULLとは?

    C言語でNULLって言葉が頻繁に出てくるのですか? NULL=値がない という理解で大丈夫ですか?

  • C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して

    C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成しています。 一応目的の動作はするのですが、プログラミングとして正しいか教えて頂ければと 思います。 <test.c> int main() { /* ---------------------------------------- */ /* 構造体のメンバ(NULL保障無し)がNULLか */ /* 比較するサンプル */ /* ---------------------------------------- */ char buf[50]; /* サンプル構造体 */ struct ST_test { int cd; char name[10]; int no; }; struct ST_test st_test; /* 構造体定義 */ memset(&st_test,0x00,sizeof(st_test)); /* 構造体初期化 */ memset(&buf[0],0x00,sizeof(buf)); /* 構造体初期化 */ /* 構造体に値セット */ st_test.cd = 12; memcpy(&st_test.name[0],"aabbccddee",sizeof(st_test.name)); st_test.no = 999; /* NULL判定 */ if(*st_test.name == 0x00) { printf("NULLです\n"); } else { printf("NULLではないです\n"); } return (0); }

  • C言語にて、以下のような配列を定義した場合の初期化(0埋め)方法が分か

    C言語にて、以下のような配列を定義した場合の初期化(0埋め)方法が分からずに困っています。 char name[50][30]; <現在やっている事> memset(&name[0][0], 0x00, sizeof( name )); 上記の方法では、sizeofの値が正しくないように思っている (正しい値は30と考えています)のですが、 正しくはどのように行うものでしょうか。 どなたか教えていただけると幸いです。 以上ですが、よろしくお願いいたします。

  • NULLポインタは0と書かなければだめ?

    C++言語を使っています。 C++言語でNULLポインタを表す場合、0やNULLを使用しますが、 「NULLは単なるマクロなので本来は0を使わなければだめ」という話を聞きました。 つまり、 int *p = 0; が本当の正しいNULLポインタであり、 int *p = NULL; は推奨されていない(?)NULLポインタというようです。 今まであまり疑うことなく、NULLポインタを表すのにNULLを使用していましたが、 上記の内容は本当でしょうか。

  • 「NULLポインタ」と「演算の結果としてのアドレス0」との比較

    ものすごく基本的な疑問です。。。 「C言語FAQ日本語訳」http://www.kouno.jp/home/c_faq/ ここの「05.ヌルポインター」を見ると以下のような意味の記述があります。 「NULLポインタは他のどんなポインタの値とも区別可能で、有効なポインタと比較しても等しくなる事はない」 「ポインタを書くべき場所に書かれた定数0はコンパイル時にNULLポインタに変換される」 そこで以下のプログラムを Borland C++ 5.5 for Win32 でコンパイル・実行してみたところ、 p1 == p2 とりました。これって変ですよね? p1 は明示的に定数0で初期化しているのでNULLポインタですが、p2 は演算の結果としてアドレス0番地を指しているので、NULLポインタでは無いですよね? これはコンパイラが間違っていると思って良いのでしょうか? #include <stdio.h> int main() { char *p1,*p2; p1 = 0; p2 = (char *)1; p2--; if(p1 == p2){ printf("p1 == p2"); } else{ printf("p1 != p2"); } return 0; }

  • Null同士の結合

    お力貸してください。 [Table111] データA   データB    データC     Name111 Null     1        5         あああ 2       Null      6         いいい 3       4        7         ううう [Table222] データA    データB     データC     Name222 Null      1         5          AAA 2        Null       6          BBB 3        4         7          CCC Table111とtable222をデータAとデータBとデーターCの3つで結合して 新しいテーブルをつくりたいです。 [TableC] データA    データB   データC  Name111   Nam222 Null       1       5      あああ       AAA 2         Null     6      いいい       BBB 3         4       7      ううう       CCC Nullもデーターとして認識させたいのですが、うまくいきません。 できれば、新しくテーブルを作ったりしたくないです。 お知恵をかしてください。よろしくおねがいします。

  • NULL

    C言語で、0の代入とNULLの代入はバイナリレベルでは同じ事だと聞いたのですが本当なんでしょうか? とすると int i = 0; と int i= NULL; は、同じ事なんでしょうか。 また、 if(!aaaa){ と if(aaaa == NULL){ は同じ条件文なんでしょうか?

  • static付き宣言の初期化

    static付きの宣言をした場合の変数の初期化について教えてください。(ANSI-C) int func(void) { static int si; static char sca[10]; static char *scp; /* 何らかの処理 */ return 0; } このように関数内でstatic付きで宣言したとき、変数はどのように初期化されますか? siは0、sca[0]からsca[9]までは'\0'、scpはNULLで初期化されますか? また、このようなstatic付きの宣言が関数の外にあった場合は、どのように初期化されますか?

  • argvのNULLチェック

    argvの値がNULLかどうかチェックしたいのですが 記述は以下で合っていますでしょうか? int main(int argc, char *argv[]){ /* パラメタのNULLチェック */ if(strcmp(argv[1] == NULL) = 0){ printf(argv[1]はNULLです); } *********************************** 上記の比較のように、argv[1] == NULL で出来ますか? argv[1] == '\0' でしょうか? }