2013-06-23 181 views
16

我有一块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(姓名)的6和sizeof (姓氏)是8.

但是bobby是5个字符宽,而eraserhead是11个宽。我期待16

为什么sizeof对字符数组和字符指针的行为不同?

任何人都可以澄清吗?

+5

'sizeof'和'strlen()'都给出'size_t'类型的结果。使用'%zu',而不是'%lu'来打印'size_t'值。或者,如果您的编译器不支持'%zu',则转换为已知类型并使用适当的格式。 –

回答

23

firstname是一个携带尾随0-终止符的char阵列。 lastname是一个指针。在64位系统上,指针的宽度为8个字节。

+0

很显然,OP试图找出字符串的大小,即字符串的长度,并添加他们两个,因为他说'“为什么不是5 + 10 = 15?”,真的有可能通过获得字符串长度'sizeof'或'strlen()'更适合?你说什么? – 0decimal0

+2

@PHIfounder:As ** C中的“字符串”由一个以''\ 0''字符**结尾的字符序列表示,使用'strlen()'获得一个“字符串”的长度。这适用于“真实”字符数组,也适用于指向后者的指针。在这种情况下,字符存储的方式和位置并不重要。事实上,保存字符串的变量不一定需要匹配“字符串”的长度。另一方面,如果它对一个变量声明要使用的字节数**感兴趣,则使用'sizeof'运算符。 – alk

+2

而存储一个字符串's'(或者's'指向)所需的字节数是'strlen(s)+ 1'。 –

3

您的第一个数组的大小为bobby\0的大小。 \0是终结符字符,因此它是6.

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

6

sizeof阵列是总阵列的大小,在“巴比”的情况下,它的5个字符和一个后\0其等于6.

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

2

firstname[]以空字符结尾,它将长度加1。

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

+3

'* lastname'是单个'char',所以'sizeof * lastname'将始终为1。 – caf

2

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

lastname是一个指向char,并将有任何大小,如你的系统上有这样一个指针。典型值是4和8.无论它指向什么(或者即使它根本没有指向任何东西),lastname的大小也是一样的。