C のポインターと配列ベースの文字列初期化で `strlen` と `sizeof` が異なる値を返すのはなぜですか?

Susan Sarandon
リリース: 2024-11-01 07:14:02
オリジナル
616 人が閲覧しました

Why do `strlen` and `sizeof` return different values for pointer and array-based string initialization in C?

文字列のポインタと配列ベースの初期化に対する strlen と sizeof からの異なる答え [重複]

C プログラミング言語で、配列と文字列へのポインターの場合、「strlen」関数と「sizeof」関数を使用してさまざまな出力を取得できます。この矛盾を理解することは、効果的なメモリ管理とデータ処理にとって重要です。

この違いを説明するには、次のコード スニペットを考えてみましょう。

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";
printf("%d %d\n",strlen(str1),sizeof(str1));    
printf("%d %d\n",strlen(str2),sizeof(str2));
ログイン後にコピー

生成される出力は次のとおりです。

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

「strlen」関数は、null 終端文字を除いた文字列内の文字数を返します。どちらの場合も、文字列には 7 文字が含まれます。一方、'sizeof' 関数はメモリ内のデータ型のサイズを返します。

ポインターである 'str1' の場合、'sizeof(str1)' はポインター変数自体のサイズを返します。これは、ほとんどのシステムでは通常 4 バイトです。これは、「str1」が配列ではなく、文字列「Sanjeev」への単なるポインタであるためです。

対照的に、「str2」は文字の配列です。 'sizeof(str2)' は、null ターミネータを含む配列全体のサイズを返します。その結果、8 バイトが出力されます。文字用に 7 バイト、ヌル終端文字用に 1 バイトです。

この概念をさらに理解するには、次の変更コードを検討してください。

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

これ出力は次のようになります:

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

「str1」と「str2」が同じ文字列を参照している場合でも、「sizeof」出力は同じままです。これは、「str1」がポインタのままであり、「str2」が配列のままであるためです。 'strlen' の出力は、文字列内の文字のみをカウントするため、両方とも 7 のままです。

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

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