C で `strlen` と `sizeof` がポインターと配列に対して異なる出力を生成するのはなぜですか?

DDD
リリース: 2024-11-01 03:03:02
オリジナル
989 人が閲覧しました

Why Do `strlen` and `sizeof` Produce Different Outputs for Pointers and Arrays in C?

ポインタと配列の初期化による Strlen と Sizedof からの異なる出力

C プログラミングでは、sizeof 関数と strlen 関数はサイズと配列に関する情報を提供します。それぞれデータ型の長さ。ただし、ポインタと配列を扱う場合、これらの関数の出力が異なる可能性があり、混乱が生じる可能性があります。

次の例を考えてみましょう。

<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
ログイン後にコピー
ログイン後にコピー

説明:

  • Str1 (ポインターの初期化): str1 は、文字列リテラル「Sanjeev」へのポインターとして初期化されます。 sizeof(str1) はポインタのサイズを示します。ほとんどのアーキテクチャでは 4 バイトです。一方、strlen(str1) は、str1 が指す文字列の長さ 7 を返します (ヌル終端文字 ' ' を除く)。
  • Str2 (配列初期化): str2 は、長さ 8 の文字配列として初期化されます。sizeof(str2) は、NULL ターミネータを含むこの配列のサイズ (8 バイト) を示します。同様に、strlen(str2) は配列に格納されている文字列の長さを返します。これも 7 です。

違いをさらに明確にするために、コードに対する次の変更を検討してください。

<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>
ログイン後にコピー

この場合、出力は次のようになります:

7 4
7 8
ログイン後にコピー
ログイン後にコピー

str1 と str2 の両方が同じ文字列を参照しているとしても、sizeof(str1) はポインターのサイズを返します。これは、str1 が配列の最初の要素を指すポインターであるのに対し、str2 は文字の配列であるためです。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!