【问题标题】:How many bytes would a string occupy, initialized for less letters一个字符串占用多少字节,初始化为更少的字母
【发布时间】:2016-01-17 14:35:40
【问题描述】:

我需要知道这个数组会占用多少字节:

char s[10] = "test";

因为"test" + "\0",会是 10 字节还是 5 字节?

【问题讨论】:

  • 无论如何,分配的内存是 10 个字节,与如何初始化、默认初始化等无关。前 5 个字节是有意义的(test+\0),其余的没有意义('\0' 或其他)。
  • 为什么要担心 5 个字节?

标签: c arrays string initialization


【解决方案1】:

只是为了澄清一点

 char s[10] = "test";

这里s 将占用 10 个字节,因为您已明确提供了大小。

OTOH,类似的定义

 char s[ ] = "test";

s 将占用 5 个字节,因为数组的大小将根据提供的初始化程序(4 个元素加上一个空终止符)确定。

char 数组的情况下,第二个被认为是更好的方法,因为有时,它可以避免您在定义大小时忘记计算空终止符空间的麻烦。

考虑场景,

 char arr[5] = "Hello";

这里,arr 的大小为 5,并且以 null 结尾。但是如果你使用

 char arr[ ] = "Hello";

编译器将自动确定包含空终止符的大小。因此,arr 的大小为 6,并包含空终止符。

【讨论】:

    【解决方案2】:

    在您的问题中,实际上有两个单独的问题。第一个对应原题的标题

    一个字符串占用多少字节,初始化为更少的字母

    第二个在原始问题的正文中

    这个数组会占用多少字节:

    char s[10] = "test";
    

    第一个问题的答案听起来像是字符串恰好占据了数组的 5 个元素。也就是字符串占用了数组的以下元素

    s[0] = 't', s[1] = 'e', s[2] = 's', s[3] = 't', s[4] = '\0'
    

    [5, 9] 范围内数组的所有其他字符将被初始化为零 '\0'

    第二个问题的答案听起来像数组的大小正好等于10 * sizeof( char ),也就是10 bytes,因为sizeof( char ) 总是等于1

    如果你改写

    char s[] = "test";
          ^^
    

    那么数组的大小将等于字符串字面量(包括终止零)的大小,最多为 5 个字符。

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 2019-11-03
      • 1970-01-01
      相关资源
      最近更新 更多