对于字符串name[]
,我们是否可以在我们的代码中使用strlen(name)+1
和sizeof(name)
可互换而无需考虑?它们是否相同?我查了一下并且发现两者的返回类型都是相同的,size_t
。并且毕竟sizeof
计算大小为字节的倍数而一个字符占用一个字节,而strlen()
计算排除\0
的字符数,因为我们必须添加1以将其等同于sizeof
的结果。
因此,除非字符的大小不是1个字节,否则两个不是可互换的,并且对于所有实际用途都是相同的吗?就像分配动态内存一样......
答案 0 :(得分:4)
对于像char name[10]
这样的声明数组,sizeof(name)
是整个数组的大小,无论它存储在哪个数据中。 strlen(name)
返回第一个0
之前数组中的字符数。如果数组中没有任何零,则strlen
的行为是未定义的。
答案 1 :(得分:2)
sizeof
是一个运算符,它告诉您一个类型(或者在您的情况下,对象的类型)占用多少字节。 strlen
是一个函数,它告诉您第一个'\0'
字符的位置,它表示字符串的结尾。
char foo[32] = "hello";
printf("sizeof foo: %zu\n", sizeof foo);
printf("strlen(foo): %zu\n", strlen(foo));
无论您在sizeof foo
中存储的是什么, foo
都是32,但正如您所看到的那样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
为sizeof (char *)
,因为它为您提供char *
(指向char的指针)中的字节数。这与strlen
函数非常不同,因为指向char的指针的大小在运行时是恒定的。
sizeof (char)
总是 1.这是C标准所要求的。如果您发现某种情况并非如此,那么它就不是C实现。
也许你的书可能会解释这个,这就是为什么我问......但是有很多质量差的书。请回答这个问题!