0

ポインタがありますchar *str;

特定のケースでif (!str)は、NULLではありませんがstr[0] == '\0'、これはいつどのように可能ですか?

編集:0 すべての回答に感謝します。基本的に、strlcpy()これは空の文字列であるため、サグフォールトが発生するソースパラメータとしてこの文字列を渡す必要があります。if (!str || str[0] == '\0')strlcpy()に渡さないよりも、次のようなチェックが必要なようです。それは正しいですか?

4

6 に答える 6

1

str[0] == '\0'の文字列(長さ0の文字列)を表すために使用されます。

于 2012-06-04T18:28:30.750 に答える
1

\0nullバイトまたはnullターミネータです。したがって、nullと見なされます。C文字列はnullで終了します。つまり、ヌルバイトが最初に検出されたとき、文字列は完全であると見なされます。他に何も\0存在しない場合、それはNULLです。

このバイトを超える情報がある場合(これは文字列にとっては悪い習慣です)、str+1どちらがnullバイトを通過するかを確認してみてください。いずれにせよ、str+1などはガベージデータであり、無効なメモリアクセスを引き起こす可能性があります(プログラムがクラッシュする原因になります)。

于 2012-06-04T18:29:44.110 に答える
1

str内の有効な(非NULL)ポインタが単一の文字を含むメモリアドレスを指している場合に発生する可能性があります\0

于 2012-06-04T18:31:12.753 に答える
1
char *str = "";

次にstr、は空の文字列へのポインタですが、そうではありませNULL*str == str[0] == 0

于 2012-06-04T18:31:46.450 に答える
1

strメモリにアドレスを保持します-のアドレスchar

(!str)strの値がでない場合にのみfalseを返しますNULL。つまり、strがアドレスを参照しない場合NULL、これは使用できないメモリアドレスです。

*strが含まれていcharます。strが指す文字がNULL、の場合、(str[0] == '\0')trueを返します。strは空の文字列を指しています。

于 2012-06-04T18:32:42.563 に答える
1

あなたは2つのことを扱っています:

まず、char*strはポインタです。str[0]NULLの場合、有効なメモリを指していないため、またはとして逆参照することはできません*char

次に、str[0]=='\ 0'`は、有効なメモリを指すポインタがあることを意味し、strが指すメモリ内の文字列の最初の位置は、文字列ターミネータである'\0'です。

于 2012-06-04T18:34:30.287 に答える