【问题标题】:C: sizeof() related doubts?C:sizeof()相关的疑惑?
【发布时间】:2014-07-17 12:11:57
【问题描述】:
#include <stdio.h>
#include <string.h>

main()
{    
   printf("%d \n ",sizeof(' '));
   printf("%d ",sizeof(""));
}

输出:

4
1

为什么第一个 printf 的 o/p 为 4,此外,如果我将它作为 '' 它显示错误为错误:空字符常量但对于双引号空白,即没有任何空格就可以没有错误?

【问题讨论】:

  • ' ' 的类型是int"" 就像 char array[] = { '\0' }; sizeof(array) 是 1。
  • 提示:始终在启用完整警告的情况下进行编译:-Wall -Wextra -pedantic 或任何适合您机器的内容。如果你这样做了,你的编译器应该警告 int 的隐式返回类型 main,所以更正它。
  • 如果你的编译器很好,它也可能会警告你错误的格式说明符:sizeof 的结果类型为size_tprintf 的格式说明符为size_t 是@987654335 @,不是d

标签: c sizeof


【解决方案1】:

' '整数字符常量 的示例,它的类型为 int(它没有被转换,它这种类型)。其次是"" 字符文字,它只包含一个字符,即空字符,由于sizeof(char)保证为1,整个数组的大小为@ 987654326@也一样。

【讨论】:

    【解决方案2】:

    ' '转换为一个整数字符常量(因此在您的机器上是 4 个字节),“”是空字符数组,它仍然是 1 个字节('\0')终止的。

    【讨论】:

    • 没有对sizeof的操作数进行转换
    • C 中,字符文字的类型是int,而不是char。所以它没有转换。
    【解决方案3】:

    在下面检查差异

     #include<stdio.h>
      int main()
      {
          char a= 'b';
          printf("%d %d %d", sizeof(a),sizeof('b'), sizeof("a"));
         return 0;
    
       }
    

    这里a定义为character,其数据类型大小为1 byte

    但“b”是character constant。字符常量是integer,字符常量的值是机器字符集中字符的数值。 sizeof char 常量不过是int 其中is 4 byte

    这是字符串文字“a” ---> 大小为字符数 + \0 (NULL) 的数组字符。这里是2

    【讨论】:

    • 简单地在C 中使用单引号,例如'a' 表示字符常量,而"a" 是一个字符数组,总是以0 字符结尾。
    【解决方案4】:

    Size of character ('a') in C/C++回答了这个问题

    在 C 中,像 'a' 这样的字符常量的类型实际上是一个 int,大小为 4(或其他一些与实现相关的值)。在 C++ 中,类型是 char,大小为 1。这是两种语言之间的许多细微差别之一。

    【讨论】:

    • 这个差异让我(和我的答案)有点不解
    【解决方案5】:

    “空格”或“任何单个字符”实际上是整数类型,等于该字符的 ASCII 值。所以它的大小将是 4 个字节。 如果创建一个字符变量并在其中存储一个字符,那么只有它存储在 1 个字节的内存中。

    char ch;
    ch=' ';
    printf("%d",sizeof(ch));
    //outputs 1
    

    要成为字符串,它必须以表示为“\0”的空字符结尾。 如果我们写一个字符串“hello”,它实际上存储为'h' 'e' 'l' 'l' 'o' '\0',这样系统就知道字符串在“hello”中的“o”之后结束,当出现空字符时停止读取。如果使用 strlen() 函数,这个字符串的长度仍然是 5,但实际上 sizeof(string) 是 6 个字节。 当我们创建一个空字符串时,比如“”,它的长度为 0,但大小为 1 个字节,因为它必须在它开始的地方终止,即在第 0 个字符处。 因此,一个空字符串只包含一个字符,即空字符,大小为 1 个字节。

    【讨论】:

      【解决方案6】:

      来自C Traps and Pitfalls

      单引号和双引号在 C 中的含义非常不同。

      用单引号括起来的字符只是在 ASCII 实现中写入与给定字符相对应的整数的另一种方式。因此' ' 的含义与 32 完全相同。

      另一方面,用双引号括起来的字符串是编写指向无名数组的初始字符的指针的简便方法,该数组已使用引号之间的字符和二进制值为的额外字符初始化零。因此,写入空字符串的“”仍然具有大小为 1 的 '\0' 字符。

      【讨论】:

        【解决方案7】:

        因为在第一种情况下,有一个字符,这就是为什么 sizeof 运算符采用字符的 SACII 值并将其作为整数,所以在第一种情况下它会给你 4。 在第二种情况下 sizeof 运算符作为字符串,在字符串中没有数据意味着它被理解为 NULL 字符串,所以 NULL 字符串大小为 1,这就是为什么它会给你答案为 1。

        【讨论】:

          猜你喜欢
          • 2012-08-20
          • 2013-06-24
          • 2015-02-04
          • 1970-01-01
          • 2011-11-27
          • 1970-01-01
          • 2015-06-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多