【问题标题】:Behaviour of sizeof() operatorsizeof() 运算符的行为
【发布时间】:2014-07-17 13:53:37
【问题描述】:

以下代码:

char a[] = "Apple";
char *s[] = {"Apple"};
printf("%d %d\n", sizeof(a), sizeof(s[0]));

输出是:

6 4

谁能告诉我为什么sizeof() 给出不同的输出?

编辑:我原本打算输入sizeof(),但改为输入strlen()。我为此道歉。我现在已经编辑了声明。

【问题讨论】:

  • Err... 可能是因为您使用 strlen 代替 s[0](不包括 0 终止符)...(不过,sizeof s[0] 会给出 sizeof(char *)
  • 因为第二个测试的不是sizeof,而是strlen? strlen 不包括终止空字符。然而,即使它是 sizeof,它也会返回指向字符串的指针的大小。
  • @mafso 哎呀!我的错。我已经编辑了问题陈述。我确实打算只写 sizeof()。
  • 参见例如here 可能还有 here。而char *s[] = {"Apple"};(除了附加标识符)等同于char *tmp = "Apple"; char *s[] = { tmp };,而不是(你似乎假设的)char s[][6] = { "Apple" };(参见我最后评论的第二部分)。相关:c-faq.com/aryptr/index.html。最后同样重要的是:使用%zu 打印size_t 变量,%d 用于int(并且sizeof 产生一个size_t 类型的对象)。
  • -1 用于更改问题!!!!

标签: c++ c string char sizeof


【解决方案1】:

sizeof(a) 是数组的大小,包含终止符以及 5 个可打印字符。

strlen(s[0]) 给出字符串的长度,不包括终止符,因为这是 strlen 指定要做的事情。

更新:sizeof(s[0]) 是指针的大小。仅给定一个指向数组的指针,就无法确定数组的大小。

【讨论】:

    【解决方案2】:

    sizeof 为您提供分配给achars 的数量,而strlen 为您提供a 中可用字符串的长度。

    【讨论】:

      【解决方案3】:

      \0 算作字符串内存大小的一部分,但字符串本身的长度由strlen() 给出,仅由遇到\0 之前的字符给出。

      【讨论】:

        【解决方案4】:

        这样声明的字符数组:

        char a[] = "Apple";
        

        根据语言规范,有一个空终止符。因此,数组的长度为6。有5个字符,然后是空终止符。

        另一方面,strlen() 返回空终止符之前的字符数。是 5。

        【讨论】:

          【解决方案5】:

          sizeof 运算符产生其操作数的大小(以字节为单位)。

          在此声明中

          char a[] = "Apple";
          

          数组 a 由包含终止零的字符串文字“Apple”的字符初始化。 其实这条记录等价于

          char a[] = { 'A', 'p', 'p', 'l', 'e', '\0'; };
          

          所以a的字节大小等于6。

          标准 C 函数strlen 对字符串中的符号进行计数,直到遇到终止零。所以

          strlen(a)

          将返回 5,即数组中终止零之前的字符数。

          考虑到你可以写例如

          char a[100] = "Apple";
          

          在这种情况下,sizeof( a ) 将产生 100,因为您明确指定了数组将占用的字节数。但是,它仅使用字符串文字的 6 个字符进行初始化。那么如何找出字符数组中有多少实际数据呢?为此,引入了函数strlen,用于区分字符数组的大小和字符数组中实际数据的数量。

          【讨论】:

            【解决方案6】:

            因为在 C 中没有字符串类型。 String 是一个以 NULL 结尾的字符数组。 strlen() 计算字符直到 NULL 字符,而 sizeof() 实际上返回字符数组使用的内存量。

            【讨论】:

              【解决方案7】:

              achars 的数组,其中包含6 个元素,因此sizeof 返回6(包括零终止符的字符串长度)。

              s 是一个指向char 的指针数组。指针大小为 4 个字节。 sizeof(s[0]) 返回第一个元素的大小,即指针,即它的大小为 4。

              【讨论】:

                【解决方案8】:

                当你定义时:

                char a[] = "苹果";

                表示一个字符数组,相当于如下定义:

                char a[] = {'A', 'p', 'p', 'l', 'e', '\0'}; // '\0' 是字符串终止符,等于 0

                由于 char 类型的大小为 1,所以 sizeof(a) 返回 6,即整个数组的大小。

                但是,当您定义时:

                char *s[] = {"苹果"};

                表示字符指针的数组。因此 sizeof(s[0]) 返回其第一个元素的大小 等于 sizeof(char*)。 对于 32 位平台,sizeof(char*) = 4。如果在 64 位平台上执行,则预期值为 8。

                【讨论】:

                  猜你喜欢
                  • 2018-03-30
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-11-26
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-03-25
                  相关资源
                  最近更新 更多