0

重複の可能性:
C のポインターと文字列に関する質問

#include<stdio.h>

int main()   
{    
char *str1="abcd";  
char str2[]="abcd";  
printf("%d %d %d\n",sizeof(str1),sizeof(str2),sizeof("abcd"));  
return 0;
}

なぜこのコードは、理想的には文字列へのポインターのようなものである場合でも、同じ答えsizeof(str2)を返すので、答えは4 4 5になるはずですsizeof("abcd")str2str1

Ideone のコード: http://ideone.com/za8aV

答え: 4 5 5

4

2 に答える 2

4

文字の配列はcharポインタではありません。配列は関数に渡されるとポインタに減衰しますが、本質的には異なります(具体的には、コンパイラはコンパイル時に正確な長さを認識しています)。4文字の文字列に5が表示される理由は、文字列リテラルcharが終了ゼロ用にもう1つ予約しているためです。4一方、はシステムに依存します。32ビットポインタを使用する4システムではが表示され、64ビットポインタを使用するシステムでは表示されます。8

于 2012-08-29T16:50:29.590 に答える
1

str2「理想的には文字列へのポインターのようなもの」というアイデアはどこから得たのですか? そうではない。str2配列です。operatorsizeofが配列に適用されると、配列オブジェクトのサイズをバイト単位で返します。

文字列リテラルも配列であるため、sizeofを文字列リテラルに適用すると、その配列オブジェクトのサイズがバイト単位で返されます。したがって、同じ結果を期待sizeof("abcd")して生成することはまったく自然なことです。sizeof(str2)そして、彼らはそうします。

PS %dは、 の結果を出力するための適切な書式指定子ではありませんsizeof。引数%dが必要ですが、値を生成します。タイプの値を出力するために使用します。intsizeofsize_t%zusize_t

于 2012-08-29T16:52:26.100 に答える