【问题标题】:Is strlen times sizeof(char) always equivalent to sizeof(literal)?strlen 乘以 sizeof(char) 是否总是等于 sizeof(literal)?
【发布时间】:2019-04-23 18:24:07
【问题描述】:

以下内容在任何实现中总是正确的吗?

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

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

【问题讨论】:

  • sizeof(char) 根据定义为 1。因此,将任何内容乘以或除以 sizeof(char) 是不好的风格。
  • @zwol:除非你想神奇地获得一个没有标题的size_t 类型到typedef 它。 ;-)
  • @R.. 嗯,是的,我想这可能很有用,但你什么时候可以不包括stddef.h
  • 是的,您可以使用strlen()+1 可靠地计算任何 string 的大小,但是您需要知道并非所有字符串文字都描述了 string i>.
  • 字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。

标签: c string byte


【解决方案1】:

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

(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】:

    不!

    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】:

      不,两者都有

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

      sizeof(myString)
      

      并不总是保证相等。如果 char 数组 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)更可取。

      【讨论】:

      • 请注意,char myString[10] = "Hello"; 不是字符串文字。它是一个char 数组,初始化为包含字符串"Hello"。这些不是一回事。
      【解决方案4】:

      在大多数情况下,等式将成立并且可以简化为 sizeof(char) 定义为 1

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

      这是最短的反例:

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

      【讨论】:

        猜你喜欢
        • 2019-02-12
        • 1970-01-01
        • 2010-09-28
        • 2012-02-13
        • 2012-08-03
        • 2010-11-09
        • 1970-01-01
        相关资源
        最近更新 更多