web-dev-qa-db-ja.com

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

私はCコードを持っていますが、sizeof(...)関数がどのように機能するか理解できません。

#include <stdio.h>

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の動作が異なるのはなぜですか?

誰でも明確にできますか?

17
user2416871

firstnameは、末尾の0- terminatorを保持するchar配列です。 lastnameはポインターです。 64ビットシステムでは、ポインターは8バイト幅です。

25
alk

sizeof配列は、配列全体のサイズです。 "bobby"の場合、5文字と1つの末尾\0これは6です。

sizeofポインターはポインターのサイズで、通常32ビットマシンでは4バイト、64ビットマシンでは8バイトです。

6
Yu Hao

最初の配列のサイズは、bobby\0のサイズです。 \0はターミネータ文字であるため、6です。

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

3
gkovacs90

_firstname[]_はヌルで終了し、長さが1増えます。

sizeof(lastname)は、実際の値の代わりにpointerのサイズを提供しています。

2
Leigh

firstnameは、6個のcharsの配列で、終端の'\0'文字列の末尾の文字。それが理由です sizeof firstnameは6です。

lastnamecharへのポインタであり、システム上でそのようなポインタが持つあらゆるサイズを持ちます。典型的な値は4と8です。lastnameのサイズは、それが何を指していようとも(あるいは何も指していなくても)同じです。

2
caf