ホームページ  >  記事  >  バックエンド開発  >  C の文字列初期化で `strlen()` と `sizeof()` が異なる結果を返すのはなぜですか?

C の文字列初期化で `strlen()` と `sizeof()` が異なる結果を返すのはなぜですか?

DDD
DDDオリジナル
2024-11-04 00:21:30818ブラウズ

Why do `strlen()` and `sizeof()` return different results for string initialization in C?

文字列初期化の strlen() と sizeof() の結果の不一致を理解する

C プログラミングでは、多くの場合、文字列に初期化されたポインターと配列を処理する場合の strlen() と sizeof() の結果。この一見矛盾した動作は、ポインタと配列の性質を理解することで説明できます。

提供されているコード例を考えてみましょう:

<code class="c">char *str1 = "Sanjeev";
char str2[] = "Sanjeev";
printf("%d %d\n", strlen(str1), sizeof(str1));
printf("%d %d\n", strlen(str2), sizeof(str2));</code>

このコードの出力は次のとおりです:

7 4
7 8

strlen() と sizeof() の異なる結果は、str1 が文字列へのポインタであるのに対し、str2 は文字の配列であるという事実に由来します。

Sizeof() と Strlen( ) Pointers

sizeof() は、データ型のサイズをバイト単位で決定します。 str1 などの char ポインターの場合、ポインターは 4 (または 8) バイトのメモリーを占有するため、sizeof は 32 ビット システムでは 4 (64 ビット システムでは 8) を返します。ただし、strlen は文字ポインタが指す文字列の長さを返します。文字列「Sanjeev」は 7 文字なので、strlen は 7 を返します。

配列

の Sizeof() と Strlen() の比較。対照的に、str2 は次の配列です。文字。 sizeof(str2) は、文字と null 終端文字 (すべての C 文字列に自動的に追加される) の両方を含む配列全体のサイズを返します。したがって、sizeof(str2) は 8 (「Sanjeev」の文字数にヌル終端文字を加えたもの) を返します。 strlen(str2) は、ヌル終端文字を除いた文字列の長さである 7 も返します。

追加の考慮事項

違いをさらに詳しく説明するために、次の点を考慮してください。 code:

<code class="c">char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;
printf("%d %d\n", strlen(str1), sizeof(str1));
printf("%d %d\n", strlen(str2), sizeof(str2));</code>

この場合、str1 は文字配列 str2 の先頭を指すポインターになります。前と同様、strlen(str1) は 7 を返し、sizeof(str1) は 4 を返します。ただし、strlen(str2) も 7 を返しますが、sizeof(str2) は引き続き 8 を返します。これは、str2 が配列のままであり、配列のサイズが変化するためです。実際に使用されているかどうかに関係なく、含まれる要素の数によって決まります。

以上がC の文字列初期化で `strlen()` と `sizeof()` が異なる結果を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。