字符数组的大小和字符指针的大小
我有一段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
的大小都是相同的(或者即使它根本没有指向任何内容)。