我有一段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在字符数组和指向字符的指针方面表现不同?
任何人都可以澄清吗?
答案 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对于字符数组和指针的行为不同 角色?
指针很少需要与数组相同的内存量。
通常,为指针分配的内存量与为其指针对象分配的内存量不同。