字符数组的大小和字符指针的大小

我有一段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对字符数组和字符指针的行为有所不同?

任何人都可以澄清吗?

firstname是一个带有尾随0 -terminator的char数组。 lastname是一个指针。 在64位系统上,指针是8字节宽。

sizeof数组是总数组的大小,在“bobby”的情况下,它是5个字符,一个尾随\0等于6。

指针的大小是指针的大小,通常在32位机器中为4个字节,在64位机器中为8个字节。

第一个数组的大小是bobby\0的大小。 \0是终止符,因此它是6。

第二个大小是指针的大小,在64位系统中是8字节。 它的大小不取决于指定的字符串长度。

firstname[]以null结尾,它将长度加1。

sizeof(lastname)给出指针的大小而不是实际值。

firstname是一个包含6个chars的数组,包括字符串末尾的终止'\0'字符。 这就是sizeof firstname为6的原因。

lastname是一个指向char的指针,它将具有指针在您的系统上具有的任何大小。 典型值为4和8.无论指向的是什么, lastname的大小都是相同的(或者即使它根本没有指向任何内容)。