文字列のポインタと配列ベースの初期化に対する 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 サイトの他の関連記事を参照してください。