对于任何字符串“char name [10] =”test“”,strlen(name)+1始终保证与sizeof(name)相同吗?

时间:2013-05-14 03:40:14

标签: c sizeof strlen size-t

对于字符串name[],我们是否可以在我们的代码中使用strlen(name)+1sizeof(name) 可互换而无需考虑?它们是否相同?我查了一下并且发现两者的返回类型都是相同的,size_t。并且毕竟sizeof计算大小为字节的倍数而一个字符占用一个字节,而strlen()计算排除\0的字符数,因为我们必须添加1以将其等同于sizeof的结果。

因此,除非字符的大小不是1个字节,否则两个不是可互换的,并且对于所有实际用途都是相同的吗?就像分配动态内存一样......

2 个答案:

答案 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 foosizeof (char *),因为它为您提供char *(指向char的指针)中的字节数。这与strlen函数非常不同,因为指向char的指针的大小在运行时是恒定的。

sizeof (char) 总是 1.这是C标准所要求的。如果您发现某种情况并非如此,那么它就不是C实现。

也许你的书可能会解释这个,这就是为什么我问......但是有很多质量差的书。请回答这个问题!