代码之家  ›  专栏  ›  技术社区  ›  Aviv Cohn

strlen乘以sizeof(char)是否总是等于sizeof(literal)?

  •  1
  • Aviv Cohn  · 技术社区  · 7 年前

    在任何实现中都是这样吗?

    (strlen("some string with weird characters") + 1) * sizeof(char) 
        == sizeof("some string with weird characters");
    

    我在问我是否能可靠地使用 (strlen(my_string) + 1) * sizeof(char) 计算任何字符串的二进制大小。另外,如果有更好的方法,请告诉我。

    1 回复  |  直到 7 年前
        1
  •  8
  •   Artyer    7 年前

    不。它唯一不同的情况是嵌入空值:

    (strlen("strlen can see this\0strlen cannot see this") + 1) * sizeof(char) 
        != sizeof("strlen can see this\0strlen cannot see this");
    

    而且 sizeof(char) 总是 1 ,所以它在那里没有意义。


    因为字符串文字是 char[N] (对于一些正尺寸 N ),这个 sizeof 方法是获取其大小的正确方法(但是 / sizeof(char) 是不必要的 1. ).

        2
  •  2
  •   Weather Vane    7 年前

    char str[20] = "abc";
    

    尺寸为20,长度为3。


    编辑: 这两种方法产生相同的结果(针对特定数据),但需要注意两点:

    sizeof(char) 总是 1 根据定义。通常,最好使用命名变量的大小,这样代码就更容易维护。例如

    char *ptr = malloc(100 * sizeof(char));
    

    不如

    char *ptr = malloc(100 * sizeof *ptr);
    

    然后,如果你要改变类型,你不必改变大小。

    另一点是 sizeof 由编译器计算,但 strlen 直到运行时才计算(除了编译器优化)。但是对于字符串文字,如果它是您想要的大小,那么 sizeof 通常效率更高,因为字符串文本在运行时无法更改。

        3
  •  0
  •   Achal    7 年前

    不,两者都有

    (strlen(myString) + 1) * sizeof(char)
    

    sizeof(myString)
    

    并不总是保证平等。If字符数组 myString 元素的个数,与前面提到的数组索引不同,那么 strlen(myString) sizeof(myString) 那就不一样了。例如在下面的例子中

    char myString[10];
    

    二者都 (strlen(myString) + 1) * sizeof(char) sizeof(myString) 结果也是一样的。但如果它是另一种情况

    char myString[10] = "Hello";
    

    结果会有所不同。

    我也更喜欢这个

    (strlen(myString) + 1) * sizeof( *myString)
    

    而不是

    (strlen(myString)+1)*sizeof(char)
    

    sizeof( *myString) 看起来很普通。

    旁注 如果 myString 是的 char* 类型,即指针类型,如

    char *myString = "some string with weird characters";
    

    用作函数参数 拿着像

    void myTestFunc(char *myString) { }
    

    然后 sizeof(myString) 行不通, strlen(myString) + 1) * sizeof( *myString) 更可取。

        4
  •  0
  •   chqrlie    7 年前

    在大多数情况下,这种平等将保持不变,可以简化为: sizeof(char) 1 根据定义。

    但是请注意,如果字符串文本包含嵌入的空字节, strlen() 将计算为小于文本大小减1。

    下面是最短的反例:

    strlen("\0") + 1 != sizeof("\0")   // strlen("\0") is 0 but sizeof("\0") is 2