你在看哪本书?sizeof
是一个运算符,它告诉您一个类型(或者在您的情况下,一个对象的类型)占用了多少字节。strlen
是一个函数,它告诉您第一个'\0'
字符的位置,它表示字符串的结尾。
char foo[32] = "hello";
printf("sizeof foo: %zu\n", sizeof foo);
printf("strlen(foo): %zu\n", strlen(foo));
sizeof foo
是 32,无论你存储什么foo
,但正如你所看到strlen(foo)
的,事实上5
,你期望'\0'
(NUL-terminator) 去的地方。
在动态分配方面,您可以期望将 的返回值存储malloc
在指针中。
char *foo = malloc(32);
strcpy(foo, "hello");
printf("sizeof foo: %zu\n", sizeof foo);
printf("sizeof (char *): %zu\n", sizeof (char *));
printf("strlen(foo): %zu\n", strlen(foo));
在这种情况下,sizeof foo
is sizeof (char *)
,因为它为您提供了 a char *
(指向 char 的指针)中的字节数。这与函数非常不同,strlen
因为指向 char 的指针的大小在运行时是恒定的。
sizeof (char)
始终为1。这是C 标准所要求的。如果您找到一个不是这种情况的实现,那么它不是 C 实现。
也许你的书可能会解释这一点,这就是我问的原因……但是有很多质量差的书。请务必回答这个问题!