【问题标题】:For any string "char name[10]="test"",is strlen(name)+1 always guaranteed to be same as sizeof(name)?对于任何字符串“char name[10]="test"”,strlen(name)+1 是否总是保证与 sizeof(name) 相同?
【发布时间】:2013-05-14 03:40:14
【问题描述】:

对于一个字符串name[],我们可以在我们的代码中使用strlen(name)+1sizeof(name) interchangeably吗?他们不一样吗?我查了一下,发现甚至两者的返回类型相同,size_t。毕竟sizeof 将大小计算为字节的倍数,一个字符占用一个字节,而strlen() 计算不包括\0 的字符数,因此我们必须添加一个 1 以将其等同于 sizeof 的结果。

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

【问题讨论】:

标签: c sizeof strlen size-t


【解决方案1】:

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

【讨论】:

    【解决方案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 终止符)去哪里。

    在动态分配方面,您可以期望将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 实现。

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

    【讨论】:

    • 该死!!我从来没有想过sizeof 总是会给出整个大小,而strlen() 只会给出存储的字符,即使它只是总大小的一小部分。
    • sizeof 是一名运营商,我知道 :-) !!
    • @Rüppell'sVulture No. 不是“存储的字符”。再读一遍答案。 strlen 返回字符串的长度,即第一个'\0' 的偏移量。相反,如果您将 "\0hello" 复制到数组中,则 strlen(foo) 将返回 0。
    • @Abhineet NULL 不是 NUL;一个是指针,另一个是字符。在您正确理解 sizeof 运算符的语法之前,请不要编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多