ホームページ  >  記事  >  バックエンド開発  >  C で「strlen」と「sizeof」がポインタベースの文字列と配列ベースの文字列で異なる結果を生成するのはなぜですか?

C で「strlen」と「sizeof」がポインタベースの文字列と配列ベースの文字列で異なる結果を生成するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-02 06:37:02186ブラウズ

Why do `strlen` and `sizeof` produce different results for pointer-based and array-based strings in C?

ポインタベースおよび配列ベースの文字列初期化における文字列の長さとサイズの計算における異なる出力

結果の理解

同じ値を持つポインターベースの文字列 str1 と配列ベースの文字列 str2 を作成する場合、関数 strlen と sizeof は異なる結果を生成します。具体的には、次の宣言の場合:

<code class="c">char *str1 = "Sanjeev";
char str2[] = "Sanjeev";</code>

strlen は、末尾のヌル終端文字 ( ) を除いた文字シーケンスの長さを測定するため、str1 と str2 の両方に 7 を返します。

ただし、sizeof は異なる値を生成します。

  • sizeof(str1) は、ポインター変数のサイズを評価するため、4 を返します。これは、通常 4 バイト (32 ビット システム) です。
  • sizeof(str2) は 8 を返します。これはヌル ターミネータを含む配列のサイズを決定し、8 バイト (7 文字 1 つのヌル ターミネータ) になるためです。

根本的な違い: データ型とメモリ割り当て

sizeof はデータ型のサイズを測定し、strlen は文字シーケンスの長さを測定します。 str1 の場合、char へのポインタなので、sizeof はポインタのサイズを返します。 str2 の場合、これは文字の配列であるため、sizeof はヌル終端文字を含む配列全体のサイズを返します。

詳しく見る

<code class="c">char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;</code>

ここで、str1 と str2 は両方とも同じ配列を指します。 strlen 値は 7 ですが、sizeof 値は異なります。

  • sizeof(str1) は 4 (ポインター サイズ)
  • sizeof(str2) は 8 (ヌル終端文字を含む配列サイズ) )

これは、サイズ評価が基礎となるデータ構造にどのように依存するかを示しています。

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

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