文字配列のサイズと文字ポインタのサイズ

私はCコードを持っていますが、 sizeof(...)関数の仕組みを理解できません。

#include 

int main(){
   const char  firstname[] = "bobby";
   const char* lastname = "eraserhead";
   printf("%lu\n", sizeof(firstname) + sizeof(lastname));
   return 0;
}

上記のコードでsizeof(firstname)は6、sizeof(lastname)は8です。

しかし、 bobby は5文字で、 eraserhead は11文字です。私は 16 を期待しています。

文字配列とポインタへのsizeofの動作が異なるのはなぜですか?

誰か明確にすることはできますか?

16
sizeofstrlen()の両方で size_t タイプの結果が得られます。 size_t の値を出力するには、%lu ではなく%zu を使用してください。または、コンパイラが%zu をサポートしていない場合は、既知の型に変換し、その型に適切な形式を使用します。
追加された 著者 Keith Thompson,

9 答え

firstname is a char array carrying a trailing 0-terminator. lastname is a pointer. On a 64bit system pointers are 8 byte wide.

24
追加された
また、 s (または s で指される)文字列を格納するために必要なバイト数は strlen(s)+ 1 です。
追加された 著者 Keith Thompson,
@PHIfounder: Cの "文字列"は、 '\ 0' 文字で終了する一連の文字で表され、 strlen() > "文字列"の長さを取得します。これは "実際の"文字配列にも、後者を指すポインタ上でも同様に機能します。この文脈では、キャラクタがどのように、どこに格納されるかが第一の重要性をもたない。実際、文字列を保持する変数は必ずしも "文字列"の長さと一致する必要はありません。一方、変数が使用すると宣言されたバイト数に興味がある場合は、 sizeof 演算子を使用します。
追加された 著者 alk,
OPが文字列の長さ、つまり文字列の長さを見つけようとしていて、 "なぜ5 + 10 = 15ではないのですか?というように、 sizeof または strlen()で文字列の長さを取得する方が適していますか?あなたは何を言っていますか?
追加された 著者 0decimal0,

firstname is a char array carrying a trailing 0-terminator. lastname is a pointer. On a 64bit system pointers are 8 byte wide.

24
追加された
また、 s (または s で指される)文字列を格納するために必要なバイト数は strlen(s)+ 1 です。
追加された 著者 Keith Thompson,
@PHIfounder: Cの "文字列"は、 '\ 0' 文字で終了する一連の文字で表され、 strlen() > "文字列"の長さを取得します。これは "実際の"文字配列にも、後者を指すポインタ上でも同様に機能します。この文脈では、キャラクタがどのように、どこに格納されるかが第一の重要性をもたない。実際、文字列を保持する変数は必ずしも "文字列"の長さと一致する必要はありません。一方、変数が使用すると宣言されたバイト数に興味がある場合は、 sizeof 演算子を使用します。
追加された 著者 alk,
OPが文字列の長さ、つまり文字列の長さを見つけようとしていて、 "なぜ5 + 10 = 15ではないのですか?というように、 sizeof または strlen()で文字列の長さを取得する方が適していますか?あなたは何を言っていますか?
追加された 著者 0decimal0,

sizeof an array is the size of the total array, in the case of "bobby", it's 5 characters and one trailing \0 which equals 6.

sizeof a pointer is the size of the pointer, which is normally 4 bytes in 32-bit machine and 8 bytes in 64-bit machine.

6
追加された

sizeof an array is the size of the total array, in the case of "bobby", it's 5 characters and one trailing \0 which equals 6.

sizeof a pointer is the size of the pointer, which is normally 4 bytes in 32-bit machine and 8 bytes in 64-bit machine.

6
追加された

最初の配列のサイズは bobby \ 0 のサイズです。 \ 0 はターミネータ文字なので6です。

2番目のサイズはポインタのサイズで、64ビットシステムでは8バイトです。そのサイズは割り当てられた文字列の長さに依存しません。

3
追加された

最初の配列のサイズは bobby \ 0 のサイズです。 \ 0 はターミネータ文字なので6です。

2番目のサイズはポインタのサイズで、64ビットシステムでは8バイトです。そのサイズは割り当てられた文字列の長さに依存しません。

3
追加された

firstname is an array of 6 chars, including the terminating '\0' character at the end of the string. That's why sizeof firstname is 6.

lastname is a pointer to char, and will have whatever size such a pointer has on your system. Typical values are 4 and 8. The size of lastname will be the same no matter what it is pointing to (or even if it is pointing to nothing at all).

2
追加された

firstname[] is null-terminated, which adds 1 to the length.

sizeof(lastname) is giving the size of the pointer instead of the actual value.

2
追加された
* lastname は1つの char なので、 sizeof * lastname は常に1になります。
追加された 著者 caf,

firstname[] is null-terminated, which adds 1 to the length.

sizeof(lastname) is giving the size of the pointer instead of the actual value.

2
追加された
* lastname は1つの char なので、 sizeof * lastname は常に1になります。
追加された 著者 caf,