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

C でのポインタと配列文字列の初期化で `strlen` と `sizeof` が異なる結果を与えるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 00:42:28169ブラウズ

Why do `strlen` and `sizeof` give different results for pointer and array 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

変動は、ポインタと配列のデータ型とオブジェクト サイズの基本的な違い。

Pointer (str1)

  • strlen(str1) は、長さを表す 7 を返します。 str1 が指す文字列 (null ターミネータを除く)。
  • sizeof(str1) は 4 を返します。これは、str1 が 4 バイトのメモリ アドレスを持つポインタ変数 (32 ビット システム) であるためです。

Array (str2)

  • strlen(str2) も、配列内の文字列の長さを考慮して 7 を返します。
  • sizeof( str2) は 8 を返します。これは、str2 がヌル終端文字を含む 8 文字を含む配列であるためです。

これらの概念をさらに詳しく説明するために、コードを少し変更してみましょう。

<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>

このコードstrlen: 7 に関しては、str1 と str2 の両方に同じ結果が生成されます。ただし、sizeof(str1) はメモリ アドレスを表す 4 のままですが、sizeof(str2) は 8 に調整され、NULL 終了文字が考慮されます。

したがって、重要なポイントは、C プログラミングで文字列を操作するときに、ポインターと配列の個別のデータ型とサイズ設定の特性を理解することです。

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

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