2013-05-14 26 views
3

对于字符串name[],我们可以使用strlen(name)+1sizeof(name)互换我们没有第二个想法码?他们难道不是一样吗?我查了一下,发现即使是返回类型都一样,size_t。而毕竟sizeof计算大小为字节的倍数并且字符占用一个字节,而strlen()计算不包括\0的字符数,因此我们必须添加1以将其等同于sizeof的结果。对于任何字符串“char name [10] =”test“”,strlen(name)+1总是保证与sizeof(name)相同?

所以,除非字符的大小小于1个字节以外的东西,不是两个可互换和同所有的实际目的呢?就像同时分配例如动态内存....

+1

请看看这个--http://stackoverflow.com/questions/8590332/difference-between-sizeof-and-strlen-in-c – Bill 2013-05-14 03:43:00

+0

@Bill不幸的是我不知道我在问什么。 – 2013-05-14 03:46:28

回答

2

哪一本书是你读? sizeof是一个运算符,它告诉你一个类型(或者你的情况,一个对象的类型)占用了多少个字节。 strlen是一个函数,告诉你第一个字符所在的位置,它表示字符串的结尾。

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

sizeof (char)总是 1.这是C标准所要求的。如果你发现不是这样的实现,那么它不是C实现。

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

+0

该死!我从未想到'sizeof'将总是给出整个大小,'strlen()'将只给出存储的字符,即使它是总大小的一小部分。 – 2013-05-14 03:51:31

+0

作为运营商的'sizeof',我知道:-)! – 2013-05-14 03:52:06

+0

@Rüppell的文化号码不是“存储的字符”。再次阅读答案。 'strlen'返回字符串的长度,这是第一个''\ 0''的偏移量。如果你将“\ 0hello”复制到数组中,那么'strlen(foo)'将返回0. – Sebivor 2013-05-14 03:53:18

4

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

相关问题