C言語関係掲示板

過去ログ

No.327.NULLと\0と0x00の違い

[戻る] [ホームページ]

No.2052

構造体の初期化方法を教えてください。
投稿者---maki(2002/07/11 19:07:37)


はじめまして。makiと申します。

C言語の初心者なのですが、NULLと\0と0x00の違いがよくわかっていません。
それでこんなサンプルを作ってみました。
この中で構造体の初期化をするためにNULL,\0,0x00を使ってますが、
この使い方は正しいですか?

いろいろなページを見てみたのですが、
具体的に理解できてないみたいです。

よろしくお願いします。
-----------------------------------------------
typedef struct{
int aaa;
char strBuf[128];
}DataBuf;

void main( )
{
DataBuf dbuf;

memset( &dbuf, '\0', sizeof( dbuf ) );
memset( &dbuf, 0x00, sizeof( dbuf ) );
memset( &dbuf, NULL, sizeof( dbuf ) );
}


No.2055

Re:構造体の初期化方法を教えてください。
投稿者---ともじ(2002/07/11 20:43:59)


こんばんは。

>この中で構造体の初期化をするためにNULL,\0,0x00を使ってますが、
>この使い方は正しいですか?

>typedef struct{
> int aaa;
> char strBuf[128];
>}DataBuf;
>
>void main( )
>{
> DataBuf dbuf;
>
> memset( &dbuf, '\0', sizeof( dbuf ) );
> memset( &dbuf, 0x00, sizeof( dbuf ) );
> memset( &dbuf, NULL, sizeof( dbuf ) );
>}

'\0'と0x00とNULLは大概の処理系で値としては0ですが、使い方が全く異なります。

'\0'は文字列の終了コードです。メモリ上には不定値が詰まっています
ので、文字列の終了をこのコードで知ることができます。

0x00はそのまま値0で、特別な意味はありません。

NULLは一般的なCの処理系では
#define NULL (void *)0
と定義されており、無効なポインタの意味を持ちます。

ですから、上記のようにmemsetで値0を設定するのなら、0x00が適当
ということになります。

ただ、上記の場合、単にstrBuf[128]の先頭に'\0'を代入し、
空文字列にするのみでよければ、
 DataBuf dbuf = {0,""};
の方が関数によるオーバヘッドがないのでいいような気もしますが。


No.2057

'\0'と0x00の違いとは?
投稿者---maki(2002/07/12 09:31:20)


ともじさん、早速のお答えありがとうございます!

NULLと\0,0x00の違いについては理解できました。
どうもNULLとNUL(0x00)を混同してたみたいです。。

ところで\0と0x00の違いがまだよくわかっていません。
「'\0'は文字列の終了コード」ですが、
'\0'をASCIIコードであらわすと0x00なんですよね?

0x00と'\0'はどう違うのでしょう?

また質問で申し訳ありませんが、よろしくお願いします。


No.2067

Re:'\0'と0x00の違いとは?
投稿者---TDa(2002/07/12 14:16:07)


>0x00と'\0'はどう違うのでしょう?

'a'と0x61, '\n'と0xaと同じです。見やすさの問題と文字定数を扱っているのだ
ということがコードにはっきりとでます。マジックナンバーがあちこちにあるようなコードは読みにくいものです。また文字コードが直に表にでないのでポータビリティが増すでしょう。

c = 'a'; と c = 0x61ではどちらが読みやすいでしょうか。c = 0x61;ではどうしてもコードを読むとき神経を使います。

それからこれは気持ちの問題ですが、NULキャラクタとして0を使用しているようなコードだと0と'\0'とNULLの区別が付かないでコーディングしているのではないかと疑ってしまいます。





No.2068

Re:'\0'と0x00の違いとは?
投稿者---ともじ(2002/07/12 15:09:21)


>>0x00と'\0'はどう違うのでしょう?
>
>'a'と0x61, '\n'と0xaと同じです。見やすさの問題と文字定数を扱っているのだ
>ということがコードにはっきりとでます。

そういうことになります。

それから、'\0' 自体は 8進拡張表記になります。
ASCIIコードの場合、エスケープシーケンスの8進拡張表記を使うと
'A'は'\101'、16進拡張表記を使うと'\x41'と等しくなります。
これはつまり、\の後に1〜3桁の数字を書くと8進数のそのコードにあたる文字、
\xの後に数字を書くと16進数のそのコードにあたる文字を表します。
 printf("%c %c %c\n",'A','\x41','\101');
の出力結果は A A A になります。
ですから、'\0'は8進数で0の文字、ということになるわけです。

>それからこれは気持ちの問題ですが、NULキャラクタとして0を使用
>しているようなコードだと0と'\0'とNULLの区別が付かないで
>コーディングしているのではないかと疑ってしまいます。

C++では0と表記する人が多いと何かで読んだ覚えがあるのですが、
実際はどうなのでしょう。Cではやっぱり、'\0'ですね。


No.2081

ありがとうございました!
投稿者---maki(2002/07/13 17:35:04)


ともじさん、TDaさん、ありがとうございました!!
疑問に思っていたことがすっきりしました。

やはりC言語はまだまだ学ぶことが多いです。
これからもがんばります。