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

时间:2013-06-23 11:21:18

标签: c char sizeof

我有一段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在字符数组和指向字符的指针方面表现不同?

任何人都可以澄清吗?

6 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

firstname[]以空值终止,它将长度加1。

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

sizeof(...)函数的工作原理

sizeof()看起来像一个函数,但不是一个函数。函数会在运行时计算内容。

sizeof()向编译器询问,它为该参数分配了多少内存。 BTW sizeof()不知道您稍后在运行时实际使用了多少。换句话说,您已经对示例中的printf参数进行了“硬编码”。

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

指针很少需要与数组相同的内存量。

通常,为指针分配的内存量与为其指针对象分配的内存量不同。