「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C で「strlen」と「sizeof」がポインタベースの文字列と配列ベースの文字列で異なる結果を生成するのはなぜですか?

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

2024 年 11 月 16 日に公開
ブラウズ:588

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

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

結果の理解

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

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";

strlen は、末尾の NULL ターミネータ (\0) を除いた文字シーケンスの長さを測定するため、str1 と str2 の両方に 7 を返します。

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

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

根本的な違い: データ型とメモリAllocation

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

詳細

char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;

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

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

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3