4

对于一个字符串name[],我们可以在我们的代码中不加思索地使用strlen(name)+1sizeof(name) 互换吗?它们不是一样的吗?我检查了一下,发现即使两者的返回类型都是相同的,size_t。毕竟sizeof将大小计算为字节的倍数并且一个字符占用一个字节,同时strlen()计算字符数,不包括\0由于我们必须添加 1 以使其与 的结果相等sizeof

因此,除非字符的大小不是 1 个字节,否则这两者不是可以互换且对于所有实际用途都相同吗?例如在分配动态内存时......

4

2 回答 2

4

对于像这样声明的数组char name[10]sizeof(name)是整个数组的大小,无论其中存储了哪些数据。 strlen(name)返回数组中第一个 之前的字符数0strlen如果数组中没有任何零,则 的行为未定义。

于 2013-05-14T03:48:15.273 回答
2

你在看哪本书?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 实现。

也许你的书可能会解释这一点,这就是我问的原因……但是有很多质量差的书。请务必回答这个问题!

于 2013-05-14T03:45:53.907 回答