你在看哪本书?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 foois sizeof (char *),因为它为您提供了 a char *(指向 char 的指针)中的字节数。这与函数非常不同,strlen因为指向 char 的指针的大小在运行时是恒定的。
sizeof (char)始终为1。这是C 标准所要求的。如果您找到一个不是这种情况的实现,那么它不是 C 实现。
也许你的书可能会解释这一点,这就是我问的原因……但是有很多质量差的书。请务必回答这个问题!