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